Мне действительно нужно уметь различать «missing» и «null» при развязывании XML в POJO. У меня есть Optional<BigInteger>
поля и адаптер для Optional
типов:Moxy JAXB и разделение между «недостающими» и явными нулями
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;
}
}
То, что я хочу для XML который отсутствует узел для этого Optional<BigInteger>
поля НЕ вызывать сеттер, но и для любого XML, который действительно есть узел, пусто (я выбрал это для представления явного null), чтобы вызвать setter, который установит поле в Optional.empty()
.
Если я сделаю это, в случае явного нуль не работает:
@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE,
isSetPerformedForAbsentNode =false)
private Optional<BigInteger> field;
поле не установлен и остается null
. Если я установил isSetPerformedForAbsentNode
в true
, тогда случай для отсутствующего узла не работает. Setter вызывается с номером null
и поле установлено равным Optional.empty()
. Есть ли способ, я могу настроить некоторую реализацию JAXB на то, что я хочу? Absent и null
означают совсем другие вещи, и я должен уметь отличать друг от друга.