2010-08-06 3 views
1

J'utilise JAXB (implémentation EclipseLink) dans un service Web JAX-RS. Lorsqu'un élément vide est transmis dans la requête XML, un objet vide est créé. Est-il possible de définir JAXB pour créer un objet nul à la place?Créer un objet vide Unmarshalling Élément vide avec JAXB

XML Exemple:

<RootEntity> 
    <AttributeOne>someText</AttributeOne> 
    <EntityOne id="objectID" /> 
    <EntityTwo /> 
</RootEntity> 

Lorsque unmarshalling, une instance de EntityOne est créé et l'attribut id sur "objectID" et une instance de EntityTwo est créé avec des attributs null. Au lieu de cela, j'aimerais qu'un objet nul pour EntityTwo ayant un objet vide me cause des problèmes avec les opérations de persistance JPA.

Répondre

0

Vous pouvez spécifier ce comportement en utilisant NullPolicy de MOXy. Vous devrez créer un DescriptorCustomizer pour modifier les mappages sous-jacents. Ne vous inquiétez pas, il est plus facile que cela puisse paraître, je démontrerai ci-dessous:

import org.eclipse.persistence.config.DescriptorCustomizer; 
import org.eclipse.persistence.descriptors.ClassDescriptor; 
import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping; 
import org.eclipse.persistence.oxm.mappings.nullpolicy.XMLNullRepresentationType; 

public class RootEntityCustomizer implements DescriptorCustomizer { 

    @Override 
    public void customize(ClassDescriptor descriptor) throws Exception { 
     XMLCompositeObjectMapping entityTwoMapping = (XMLCompositeObjectMapping) descriptor.getMappingForAttributeName("entityTwo"); 

     entityTwoMapping.getNullPolicy().setNullRepresentedByEmptyNode(true); 
     entityTwoMapping.getNullPolicy().setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE); 
    } 

} 

Voici comment vous associer la customizer avec votre classe modèle:

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

import org.eclipse.persistence.oxm.annotations.XmlCustomizer; 

@XmlRootElement(name="RootEntity") 
@XmlCustomizer(RootEntityCustomizer.class) 
public class RootEntity { 

    private String attributeOne; 
    private Entity entityOne; 
    private Entity entityTwo; 

    @XmlElement(name="AttributeOne") 
    public String getAttributeOne() { 
     return attributeOne; 
    } 

    public void setAttributeOne(String attributeOne) { 
     this.attributeOne = attributeOne; 
    } 

    @XmlElement(name="EntityOne") 
    public Entity getEntityOne() { 
     return entityOne; 
    } 

    public void setEntityOne(Entity entityOne) { 
     this.entityOne = entityOne; 
    } 

    @XmlElement(name="EntityTwo") 
    public Entity getEntityTwo() { 
     return entityTwo; 
    } 

    public void setEntityTwo(Entity entityTwo) { 
     this.entityTwo = entityTwo; 
    } 

} 

Dans la prochaine version de Moxy (2.2) vous serez en mesure de le faire via des annotations.

@XmlElement(name="EntityTwo") 
@XmlNullPolicy(emptyNodeRepresentsNull=true, 
       nullRepresentationForXml=XmlMarshalNullRepresentation.EMPTY_NODE) 
public Entity getEntityTwo() { 
    return entityTwo; 
} 

Vous pouvez essayer maintenant avec l'un des EclipseLink 2.2.0 nightly builds:

+0

J'utilise EclipseLink 2.2.0, donc ajouté les annotations à ma classe . Malheureusement, il a le comportement de définir un élément à null quand il est vide mais a une propriété définie. Par exemple EntityOne dans l'exemple ci-dessus retourne maintenant un objet nul. Est-ce le comportement attendu? – sdoca

+0

Ceci est un bug, voir https://bugs.eclipse.org/322183. Nous aurons une solution dans cette semaine. Pour voir le comportement correct, vous pouvez faire de la propriété id sur Entity un élément au lieu d'un attribut. –

+0

J'avais changé d'attributs à propriétés et cela signifie un XML un peu plus verbeux, mais cela fonctionne. Merci! – sdoca