49 votes

JAXB Marshalling avec des champs nuls

C'est une question assez simple demande, mais je n'ai tout simplement pas trouver un moyen de le faire.

J'essaie de configurer un rôle dans JAXB qui dit que chaque fois qu'un champ nul est rencontré, au lieu de l'ignorer dans la sortie, le régler à une valeur vide. Ainsi, pour la classe :

@XMLRootElement
Class Foo {
   Integer num;
   Date date;
….
}

Lorsque cela a été rassemblés dans le fichier XML si le champ date est nulle, ma sortie n'a pas qui élément en elle. Ce que je veux faire est d'inclure tous les champs de la sortie; et si ils sont nuls, les remplacer à - dire un vide. Si la sortie doit être :

<foo>
  <num>123</num>
  <date></date>
</foo>

Merci,

Jalpesh.

40voto

Jalpesh Points 630

Merci les gars pour vos réponses.

Chris Dail - j'ai essayé votre approche, et il n'a pas vraiment faire ce que je voulais. JAXB était encore ignorant mes valeurs nulles, en dépit de définir une valeur par défaut pour mes champs.

Je l'ai fait tomber sur la réponse, après que quelqu'un dans le Maillot des forums m'a montré à la section documentation 2.2.12.8 Aucune Valeur.

Fondamentalement, tout ce que j'avais à faire était d'ajouter ce qui suit à mon champs :

@XmlElement(nillable = true) 

Une fois j'ai ajouté que, JAXB présenteraient ces champs lors de la sérialisation en XML comme ceci:

...
<num>5</num>
<date xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
....

4voto

Chris Jester-Young Points 102876

Mais mais mais ... une chaîne vide n'est pas une représentation lexicale valide pour une date, vous ne pouvez donc pas le faire. Autrement dit, si vous avez généré un document XML avec une valeur vide pour un champ de date, il ne sera pas validé correctement.

En d’autres termes, si votre élément date a un minOccurs de 1 ou plus et pas nillable , alors vous devez absolument avoir (1 ou plus) dates, qui ne peut pas être null (ou des blancs, ou d'autres non-valeurs).

2voto

Chris Dail Points 11406

Comme indiqué dans l’autre réponse, elle est invalide car ce n’est pas une date valide. J'ai eu un problème similaire où je voulais gérer (même que) spécialement. Étant donné que vous ne pouvez pas utiliser la valeur null, vous pouvez utiliser le mécanisme de valeur par défaut dans JAXB. Ce qui suit sera la valeur par défaut si aucune n'est spécifiée. Vous pouvez via le code détecter cette date spéciale et gérer ce cas d'exception.

 @XmlElement(defaultValue="1970-01-01T00:00:00.0-00:00")
 

Il est donc possible de détecter et de vider la date, mais vous ne pouvez pas utiliser null pour le faire.

1voto

Jan Serneels Points 11

Dans MOXy u pouvez spécifier comment la jsonProvider doit faire son travail pour JAXB.

Donc, quand on fait de JAX-RS, ajoutez le code suivant dans votre classe dérivée de l'Application

J'ai utilisé ce code sur Tomcat 7 avec de bons résultats. (eclipselink 2.4.1)

@ApplicationPath("/rest")
public class RestApplication extends Application
{

  ...

 public Set< Object> getSingletons()
  {

    HashSet<Object> set = new HashSet<Object>(1);
    set.add( newMoxyJsonProvider());

    return set;
  }


 public static MOXyJsonProvider newMoxyJsonProvider()
  {

    MOXyJsonProvider result = new MOXyJsonProvider();

    //result.setAttributePrefix("@");
    result.setFormattedOutput( false);
    result.setIncludeRoot( false);
    result.setMarshalEmptyCollections( true);
    //result.setValueWrapper("$");

    return result;
  }

Sur Glassfish 3.1.2 et a ÉTÉ de 8,5 cependant, newMoxyJsonProvider() n'est pas nécessaire, mais alors le JAXB fournisseur de se configure par le serveur. Dans le cas de Glassfish, qui est livré avec MOXy, j'ai connu les mêmes problèmes avec des valeurs null. Ne cochez pas encore, mais imagine que la réponse est dans la configuration de JAXB à l'application, au niveau du serveur, si possible à tous.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X