Я переформатировал вопрос, надеюсь, сделать мои намерения более ясными.
Архитектура
Я пишу несколько веб-сервисов, которые я буду публиковать с помощью JAX-WS. Процесс, который мы использовали в течение некоторого времени, - это сначала написать схему, которая определяет только объекты запроса и ответа. Это отправляется клиенту для утверждения структуры сообщений xml. Я не хочу сам писать весь wsdl, поскольку он более сложный, чем базовая схема.
Далее я использую JAXB-команду xjc для генерации классов на основе типов запросов и ответов в моей схеме. Затем я использую эти классы как параметры и типы возвращаемых данных в классе аннотированных конечных точек JAX-WS.
Теперь это дает мне веб-сервис, который я могу позвонить. Это дает мне больше контроля за отправкой и возвратом xml, а также автоматизирует повторение, необходимое для написания полного wsdl.
Проблема
В схеме у меня есть такой элемент:
<xs:element name="myElement" type="xs:string" nillable="true" minOccurs="0" />
Поэтому я хочу различать пользовательский параметр null или blank. Сгенерированный класс имеет этот атрибут.
@XmlElementRef(name = "myElement", namespace = "/mynamespace", type = JAXBElement.class)
protected JAXBElement<String> myElement;
Эффект этого заключается в том, что элемент не становится ни полным, ни дополнительным. Схема, которую JAX-WS пишет как часть wsdl, установила обязательный элемент, а не nillable, и если я отключу проверку схемы, я все равно не могу передать ноль моему объекту.
Проверенные вещи
Если я изменю его, чтобы он был необходим и nillable, тогда я получаю этот сгенерированный код.
@XmlElement(required = true, nillable = true)
protected String myElement;
Если я изменю его на необязательный и не nillable, тогда я получу этот сгенерированный код.
protected String myElement
Таким образом, вы можете иметь либо или не оба, как кажется, если вы используете JAXB. Тщательно разочаровывает!
Я также попытался вручную изменить сгенерированный класс, чтобы выглядеть так.
@XmlElementRef(name = "myElement", namespace = "/mynamespace", type = JAXBElement.class, required=false)
protected JAXBElement<String> myElement;
Теперь этот элемент становится необязательным, но я все равно не могу установить его на нуль. В результате получается JAXBElement со значением пустой строки. Это происходит только в том случае, если вы отключили проверку схемы, поскольку результирующая JSX-WS wsdl/schema не устанавливает элемент как nillable, поэтому его недействительный запрос.
Резюме
Я полагаю, что это ошибка с JAXB. Аннотация @XmlElementRef имеет атрибут, чтобы установить его как необязательный, но нет атрибута для установки поля как nullable.
В аннотации @XmlElement есть атрибуты как требуемые, так и нулевые, но они приводят только к нулевому объекту, поэтому не было способа различать элемент, не включенный в xml, или элемент, который был включен, но null. Вот почему вам нужно использовать @XmlElementRef вместе с JAXBElement.
Я думаю, что ошибка включает в себя две проблемы. Сначала команда xjc должна генерировать элемент с обязательным = false. Во-вторых, должен быть атрибут на @XmlElementRef, чтобы установить, является ли элемент нулевым, и это также должно быть установлено.
Кто-нибудь знает об исправлении/обходном пути? Я попробовал поиск в Интернете, но нашел людей, задающих один и тот же вопрос без ответа. Это обычно означает, что это невозможно... TIA.
Дополнительные
Я использую jaxb 2.2.6, а плагин maven - jaxb2-maven-plugin 1.5.