1

以前は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
            }
        }
    }
}
4

1 に答える 1

0

私はあなたが見ているエラーを再現することができました。次のバグを使用して、この問題の進捗状況を追跡できます。

回避策

StringFieldAdapter回避策として、クラスを公開することができます。

public static class StringFieldAdapter extends XmlAdapter<String, StringField> {
于 2013-01-04T14:25:19.860 に答える