Как я могу заставить JAXB потерпеть неудачу, когда отсутствует обязательный элемент? - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь добавить некоторую прямую совместимость к Java-приложению, вызывающему Web-сервис на работе, но JAXB, похоже, ведет себя не так, как надо ...

Приложение использует плагин wsdl2java Mavenсоздать клиент веб-службы CXF из WSDL.Затем он использует этот сгенерированный клиент для связи с веб-службой (через SOAP через JMS).Когда веб-служба отправляет неизвестный элемент в своем ответе на вызов, JAXB завершается с ошибкой «неожиданный элемент», которая понятна и совместима с XML.Чтобы обеспечить более прямую совместимость, я указал пользовательский jaxb-reader-validation-event-handler, чтобы игнорировать эти конкретные ошибки, что решило проблему.

Но, выполняя некоторые дополнительные тесты, я обнаружил поведение, не совместимое с XML.
СначалаJAXB не заботится о порядке элементов, даже внутри sequence, который не совместим с XML, но хорош для прямой совместимости, так почему бы и нет.
Тем не менее, его также не волнует обязательный элемент(minOccurs="1") отсутствует, любезно присваивая ему произвольное значение по умолчанию (то есть для элементов, связанных с примитивными значениями Java, их значения по умолчанию, например, 0 для int!).
Это неXML-совместимые и не подходят для совместимости: если вам нужна обязательная, скажем, цена в виде целого числа, но веб-служба по какой-то причине не предоставляет ее, JAXB присваивает ей значение 0 безпредупреждение, что делает отладку действительно трудной.
Очевидно, это потому, что если JAXB не встречает элемент, он просто не вызывает его установщик, что означает, что он сохранитts значение по умолчанию.
[EDIT: я провел несколько дополнительных тестов, и когда приложение ожидает 1 элемент (maxOccurs="1"), но веб-служба отправляет 2, JAXB дважды вызывает один и тот же установщик, переопределяя первое значение вторымкажется, что после того, как клиент сгенерирован из WSDL, minOccurs и maxOccurs просто игнорируются ...]

Как заставить JAXB завершиться с ошибкой, если отсутствует обязательный элемент?


Мы заметили, что даже для элемента с minOccurs="1" аннотация соответствующего сгенерированного атрибута не содержит required = true.Я пытался добавить его вручную после генерации и перед запуском приложения, но безуспешно: кажется, его просто игнорируют ...

1 Ответ

0 голосов
/ 23 июня 2019

Может быть, дополнительная проверка JSR-303 охватывает то, что вы хотите достичь. Вы можете либо расширить поведение xjc с помощью плагина, например: https://github.com/krasa/krasa-jaxb-tools, чтобы аннотировать классы привязки, либо использовать Hibernate Validator в сочетании с конфигурацией проверки XML, как описано здесь: https://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-xmlconfiguration.html#validator-xmlconfiguration

...