JAXB élément qui est à la fois facultatif et nillable

J'ai re-formaté la question, nous l'espérons, pour rendre ma pensée plus claire.

Architecture
Je suis en train d'écrire certains services web, que je vais publier moi-même à l'aide de JAX-WS. Le processus que nous avons utilisé pendant un certain temps est d'abord écrire un schéma qui définit seulement les objets request et response. Ce est envoyé au client à approuver la structure des messages xml. Je ne veux pas écrire tout le wsdl moi-même que c'est plus compliqué que le schéma de base.

Ensuite, j'utilise le JAXB commande xjc pour générer des classes en fonction de la demande et de la réponse des types dans mon schéma. J'ai ensuite utiliser ces classes que les paramètres et les types de retour sur un JAX-WS annoté point de terminaison de la classe.

Cela me donne un service web, je peux appeler. Cela me donne plus de contrôle sur le xml envoyés et retournés, mais aussi automatise la répétition nécessaire à l'écriture de l'pleine wsdl.

Problème
Dans le schéma que j'ai un élément comme ceci:

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

Je tiens donc à distinguer entre l'utilisateur réglage de la valeur null ou vide. La classe générée puis a cet attribut.

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

L'effet de ceci est que l'élément devient ni nillable ou facultatif. Le schéma que JAX-WS écrit dans le cadre de l'wsdl a défini l'élément obligatoire et pas nillable et si je désactive la validation du schéma, je ne peux pas passer à néant par le biais de mon objet.

Choses essayé
Si je change exigée et nillable puis-je obtenir le code généré.

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

Si je l'ai changer d'option et de ne pas nillable puis-je obtenir le code généré.

protected String myElement

De sorte que vous pouvez avoir deux ou mais pas les deux, il semble que si vous utilisez JAXB. Complètement décevant!

J'ai aussi essayé de modifier manuellement la classe générée à ressembler à cela.

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

Cela fait maintenant de l'élément optionnel, mais je n'arrive toujours pas à néant. Cette opération aboutit à un JAXBElement avec une valeur de chaîne vide. C'est uniquement si vous activez la validation du schéma de comme la résultante de JAX-WS wsdl/schéma ne pas définir l'élément nillable, donc ce n'est pas une demande valide.

Résumé
C'est ma conviction que c'est un bug avec JAXB. @XmlElementRef annotation a un attribut pour définir qu'il n'est pas nécessaire, mais il n'y a pas d'attribut pour définir le champ comme nullable.

L' @XmlElement annotation a des attributs à la fois nécessaire et nullable mais ces juste le résultat dans un objet null si il n'y aurait aucun moyen de distinguer entre un élément non inclus dans le fichier xml ou un élément qui a été inclus, mais la valeur null. C'est pourquoi vous devez utiliser @XmlElementRef avec JAXBElement.

Je pense que le bug comprend deux questions. D'abord le xjc commande doit générer l'élément avec required=false. Deuxièmement, il doit être un attribut sur @XmlElementRef pour définir si l'élément est nullable et cela devrait être réglé trop.

Personne ne sait d'une solution/solution de contournement? J'ai essayé de googler, mais seulement constaté que les gens posent la même question sans réponse. Cela signifie généralement qu'il n'est pas possible... TIA.

Supplémentaires
Je suis l'aide de jaxb 2.2.6 et le plugin maven est jaxb2-maven-plugin 1.5.

OriginalL'auteur Ben Thurley | 2013-10-29