JAXB, CXF: нет ObjectFactory с @XmlElementDecl для элемента … с помощью

#java #wsdl #jaxb #cxf

#java #wsdl #jaxb #cxf

Вопрос:

Я создаю первый веб-сервис WSDL с помощью JAXB и CXF. У меня нет WSDL, поэтому я не могу вносить в него изменения. Я использую ftp://ftp.ihe.net/TF_Implementation_Material/ITI/wsdl/PIXManager.wsdl в качестве моего WSDL. Я использовал CXF 2.3.0 для генерации классов Java.

Генерация класса Java прошла нормально, но когда я пытаюсь запустить это в веб-приложении, я получаю сообщение об ошибке

 com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 17 counts of IllegalAnnotationExceptions
  

17 отсчетов имеют формат

 There's no ObjectFactory with an @XmlElementDecl for the element {urn:hl7-org:v3}assignedDevice.
        this problem is related to the following location:
            at protected javax.xml.bind.JAXBElement org.hl7.v3.QUQIMT021001UV01AuthorOrPerformer.assignedDevice
  

Когда я захожу в упомянутый класс, то есть QUQIMT021001UV01AuthorOrPerformer и смотрю на поле assignedDevice , я вижу это

 @XmlElementRef(name = "assignedDevice", namespace = "urn:hl7-org:v3", type = JAXBElement.class)
protected JAXBElement<COCTMT090300UV01AssignedDevice> assignedDevice;
  

Когда я смотрю на ObjectFactory пакета, я вижу это

 private final static QName _COCTMT090303UV01AssignedDeviceAssignedDevice_QNAME = new QName("urn:hl7-org:v3", "assignedDevice");
  

Все мои 17 ошибок похожи. Что я могу сделать во время моего codegen или среды выполнения, чтобы заставить мой сервис работать?

Комментарии:

1. Я использовал несколько WSDL в своем codegen, и это вызывало конфликт в этих определениях. Я сократил его до одного WSDL, и он отлично работает. Однако я хотел бы посмотреть, как использовать несколько WSLD, используемых в codegen.

Ответ №1:

Какую версию Java вы используете во время выполнения? У меня была аналогичная проблема со схемой OTA при запуске с Java 6. Я устранил проблему, внеся следующие изменения в конфигурацию Maven:

  1. Используйте JAXB impl 2.1.* (вместо 2.2) с provided областью видимости, чтобы соответствовать версии JAXB, включенной в Java 6.
  2. Используйте JAX-WS 2.1 (вместо 2.2), чтобы соответствовать Java 6 и JAXB 2.1.x.
  3. Добавьте опцию frontEnd в подключаемый модуль Maven cxf-codegen-plugin и установите для нее значение jaxws21 (или, если используете wsdl2java в командной строке, используйте опцию « -fe jaxws21 «).

Комментарии:

1. Спасибо за ваши идеи. Я пробовал эти вещи и, наконец, решил отказаться от Java / CXF для обработки этих сервисов. Я решил создать контроллер Spring на основе Groovy, который использует обработку Xml GroovyGoodness ™.

Ответ №2:

Когда вы генерируете классы, вы также генерируете файл с именем jaxb.properties. Убедитесь, что этот файл доступен приложению во время выполнения. У меня была такая же проблема, и это было связано с упаковкой maven: maven не будет включать в пакет файлы ресурсов (например, jaxb.properties), которые находятся ниже дерева src / main / java, если специально не указано, чтобы сделать это. Я сделал это с помощью org.codehaus.mojo:build-helper-maven-plugin с целью добавления ресурса. Надеюсь, это поможет

Ответ №3:

Я столкнулся с подобной ошибкой, и причиной были конфликты между сгенерированными веб-сервисами заглушками java-классов.

если приведенные выше ответы не работают, попробуйте поискать конфликты.

добавляйте по одной заглушке за раз и добавляйте постепенно.

надеюсь, это поможет