Je dois vraiment pouvoir faire la distinction entre 'manquant' et 'nul' lors de la conversion d'un fichier XML en POJO. J'ai un champ Optional<BigInteger>
et un adaptateur pour Optional
types:Moxy JAXB et la distinction entre les 'manquants' et les nulls explicites
public abstract class OptionalAdapter<T> extends XmlAdapter<T, Optional<T>> {
@Override
public Optional<T> unmarshal(T value) throws Exception {
log.debug("Unmarshalling value: {}", value);
if(value == null) {
log.debug("Value is null, returning Optional.empty()");
return Optional.empty();
} else {
log.debug("Value is not null, returning an optional holding the value");
return Optional.of(value);
}
}
@Override
public T marshal(Optional<T> value) throws Exception {
if (value == null) {
return null;
}
return value.isPresent() ? value.get() : null;
}
}
Ce que je veux XML qui manque un nœud pour ce champ Optional<BigInteger>
appeler non pas le compositeur, mais pour tout XML qui a un noeud qui est vide (j'ai choisi ceci pour représenter une valeur nulle explicite) pour appeler le setter qui définira le champ à Optional.empty()
.
Si je fais cela, le cas pour nulle explicite ne fonctionne pas:
@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE,
isSetPerformedForAbsentNode =false)
private Optional<BigInteger> field;
Le champ n'est pas défini et reste null
. Si je mets isSetPerformedForAbsentNode
à true
, alors le cas du noeud manquant ne fonctionne pas. Le setter est appelé avec null
et le champ est défini sur Optional.empty()
. Y at-il un moyen, je peux configurer une certaine mise en œuvre de JAXB à ce que je veux? Absent et null
signifient des choses très différentes et je dois être capable de faire la différence.