以前はSunのJAXBのRIを使用していましたが、カスタムマーシャラーを使用してnull文字列にマーシャリングできないというバグが発生しました。
この問題を回避するためにMOXyに切り替えましたが、少なくともすぐに使用できる状態では、MOXyはプライベートXmlAdaptersを処理しないことがわかりました。むしろ、IllegalAccessExceptionをスローします。これを複製するサンプルコードについては、以下を参照してください。
MOXyにプライベートXmlAdaptersを使用するように説得する方法はありますか、それともパブリックXmlAdaptersに固執していますか?もちろん、私はドキュメントを読み、解決策をGoogleに試しましたが、何も飛び出しませんでした。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlJavaTypeAdapter(StringField.StringFieldAdapter.class)
public class StringField {
private static final long serialVersionUID = 1L;
@XmlValue
private String value;
public boolean isSet() {
return value != null;
}
public void reset() {
value = null;
}
public String get() {
return value;
}
public void set(String value) {
this.value = value;
}
// N.B - 'non-public' class works with RI, but not with MOXy
private static class StringFieldAdapter extends XmlAdapter<String, StringField> {
@Override
public StringField unmarshal(String v) throws Exception {
StringField field = new StringField();
if (v != null) {
field.set(v);
}
return field;
}
@Override
public String marshal(StringField v) throws Exception {
if (v != null && v.isSet()) {
return v.get();
}
else {
return null; // Switched to MOXy because this doesn't work in the RI
}
}
}
}