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:
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
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. –
J'avais changé d'attributs à propriétés et cela signifie un XML un peu plus verbeux, mais cela fonctionne. Merci! – sdoca