Element JAXB, który jest zarówno opcjonalny, jak i dostępny

Ponownie sformatowałem pytanie, aby mieć nadzieję, że moje intencje staną się jaśniejsze.

Architektura
Piszę kilka serwisów internetowych, które będę publikować za pomocą JAX-WS. Proces, którego używamy od jakiegoś czasu, polega na napisaniu schematu, który definiuje tylko obiekty żądania i odpowiedzi. Zostanie on wysłany do klienta, aby zatwierdzić strukturę wiadomości xml. Nie chcę sam pisać całego pliku wsdl, ponieważ jest bardziej skomplikowany niż podstawowy schemat.

Następnie używam komendy JAXB xjc do generowania klas na podstawie typów żądań i odpowiedzi w moim schemacie. Następnie używam tych klas jako parametrów i typów zwracanych w klasie końcowej z adnotacją JAX-WS.

To daje mi teraz usługę internetową, do której mogę zadzwonić. Daje mi większą kontrolę nad wysyłanym i zwracanym xml, ale także automatyzuje powtórzenie wymagane przy pisaniu pełnego kodu WSDL.

Problem
W schemacie mam taki element:

<xs:element name="myElement" type="xs:string" nillable="true" minOccurs="0" /> 

Chcę więc rozróżnić ustawienie użytkownika puste lub puste. Wygenerowana klasa ma ten atrybut.

@XmlElementRef(name = "myElement", namespace = "/mynamespace", type = JAXBElement.class)
protected JAXBElement<String> myElement;

Efektem tego jest to, że element nie staje się ani dostępny, ani opcjonalny. Schemat zapisywany przez JAX-WS jako część wsdl ustawił element na obowiązkowy i nie można go ustawić, a jeśli wyłączę sprawdzanie poprawności schematu, nadal nie mogę przejść do obiektu.

Rzeczy próbowały
Jeśli zmienię go na wymagany i dostępny, otrzymam wygenerowany kod.

@XmlElement(required = true, nillable = true)
protected String myElement;

Jeśli zmienię go na opcjonalny i nie można go ustawić, otrzymam wygenerowany kod.

protected String myElement

Więc możesz mieć albo jedno, albo drugie nie, jeśli używasz JAXB. Całkowicie rozczarowujące!

Próbowałem również ręcznie zmienić wygenerowaną klasę, aby wyglądała tak.

@XmlElementRef(name = "myElement", namespace = "/mynamespace", type = JAXBElement.class, required=false)
protected JAXBElement<String> myElement;

To sprawia, że ​​element jest opcjonalny, ale nadal nie mogę ustawić go na zero. W ten sposób powstaje element JAXBElement o wartości pustego łańcucha. To tylko wtedy, gdy wyłączasz sprawdzanie poprawności schematu, ponieważ wynikowy schemat wsdl / scdl JAX-WS nie ustawia elementu jako możliwy do wykonania, więc nie jest to poprawne żądanie.

streszczenie
W moim przekonaniu jest to błąd związany z JAXB. Adnotacja @XmlElementRef ma atrybut, aby ustawić go jako niepotrzebny, ale nie ma atrybutu, który ustawiałby to pole jako puste.

Adnotacja @XmlElement ma atrybuty zarówno wymagane, jak i zerowe, ale skutkują one po prostu obiektem zerowym, więc nie byłoby sposobu na rozróżnienie między elementem nieuwzględnionym w xml lub elementem, który został dołączony, ale jest pusty. Dlatego musisz użyć @XmlElementRef wraz z JAXBElement.

Myślę, że błąd zawiera dwa problemy. Najpierw polecenie xjc powinno wygenerować element z parametrem required = false. Po drugie powinien istnieć atrybut @XmlElementRef, aby ustawić, czy element jest dopuszczalny do zera, i to powinno być również ustawione.

Czy ktoś wie o poprawce / obejściu? Próbowałem googla, ale znalazłem tylko ludzi zadających to samo pytanie bez odpowiedzi. Zwykle oznacza to, że nie jest możliwe ... TIA.

Dodatkowy
Używam jaxb 2.2.6, a wtyczka maven to jaxb2-maven-plugin 1.5.

questionAnswers(3)

yourAnswerToTheQuestion