XMLをPOJOにアンマーシャリングするときに、本当に 'missing'と 'null'を区別できる必要があります。私はOptional<BigInteger>
フィールドを持っているとOptional
タイプ用のアダプタ:私が欲しいものMoxy JAXBと 'missing'と明示的nullを区別する
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;
}
}
はセッターを呼び出さないために、このOptional<BigInteger>
フィールドのノードが欠落しているXMLのために、しかし、どのノードを持たないすべてのXMLのためでありますフィールドがOptional.empty()
に設定されるセッターを呼び出すために空(私は明示的なnullを表すためにこれを選択しました)です。
@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE,
isSetPerformedForAbsentNode =false)
private Optional<BigInteger> field;
フィールドが設定されていないとnull
のまま:私はこれを行う場合は
、明示的なヌルのためのケースでは動作しません。 isSetPerformedForAbsentNode
をtrue
に設定すると、ノードが見つからない場合のケースが機能しません。セッターはnull
で呼び出され、フィールドはOptional.empty()
に設定されます。何らかの方法がありますが、私はJAXBの実装をいくつか設定して、私が望むものを作ることができますか? Absentとnull
は非常に異なるものを意味し、私はその違いを伝えることができる必要があります。