Ich muss wirklich 'fehlende' und 'null' unterscheiden können, wenn Sie XML in ein POJO entpacken. Ich habe ein Optional<BigInteger>
Feld und einen Adapter für Optional
Typen:Moxy JAXB und distinguishing zwischen 'fehlende' versus explizite Nullen
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;
}
}
Was ich will, für XML ist, die einen Knoten für dieses Optional<BigInteger>
Feld fehlt nicht der Setter nennen, aber für jede XML, die einen Knoten hat, mit welchen ist leer (ich habe dies gewählt, um eine explizite Null darzustellen), um den Setter aufzurufen, der das Feld auf Optional.empty()
setzt.
Wenn ich dies tun, wird der Fall für explizite null nicht:
@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE,
isSetPerformedForAbsentNode =false)
private Optional<BigInteger> field;
Das Feld ist nicht festgelegt und bleibt null
. Wenn ich isSetPerformedForAbsentNode
auf true
einstelle, funktioniert der Fall für fehlende Knoten nicht. Der Setzer wird mit null
aufgerufen und das Feld wird auf Optional.empty()
gesetzt. Gibt es eine Möglichkeit, kann ich einige Implementierung von JAXB zu was ich will konfigurieren? Abwesend und null
bedeuten sehr unterschiedliche Dinge und ich muss in der Lage sein, den Unterschied zu erkennen.