web-dev-qa-db-ja.com

ゲッター、セッター、メンバーに付けられたJAXBアノテーションの違いは何ですか?

タイトルがすべてを物語っています。

フィールド/ゲッター/セッターにJAXBアノテーション(@XmlElementなど)を配置することの主な違いを知りたいのですが。 (単純なケースでは)それは問題ではないように私には思えます。

例えば。これを取りましょう

class A  {
    private String a;

    public String getA() { return a; }

    public void setA(String a) { this.a = a; }
}

@XmlElementをメンバーフィールドに配置するか、ゲッター/セッターに配置するかは問題ではないようです。マーシャルは大丈夫です。違いを生む必要があるとき、そしてそれが重要なときのユースケースはありますか?

これをアンマーシャル(xmlをAに戻す)に行くと、JAXBは具体的に何をしますか?

JAXBMOXy実装を使用しています

ありがとう

20
stewenson

デフォルトでは、JAXB implsは、プロパティ(get/setペア)、パブリックフィールド(インスタンス変数)、および注釈付きの非パブリックフィールドをマップされたものとして扱います。フィールドに注釈を付けるだけでは、マップされたプロパティの重複例外が発生します。

フィールドに注釈を付ける場合は、クラスで@XmlAccessorType(XmlAccessType.FIELD)を指定する必要があります。

詳細情報

12
bdoughan

セッターメソッドとゲッターメソッドでJAXBアノテーションをマークすることに違いはありません。マーシャリングとアンマーシャリングの両方をテストしましたが、どちらも正常に機能しました。ただし、注釈を付ける必要があるのはそのうちの1つだけです。 getterメソッドまたはsetterメソッドのいずれか。両方に注釈を付けることはできません。注釈を付けると、次のようなランタイム例外が発生します。

com.Sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
at com.Sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.Java:91)
at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.Java:445)
at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.Java:277)
at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.Java:124)
at com.Sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.Java:1123)
at com.Sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.Java:147)
at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
at Java.lang.reflect.Method.invoke(Method.Java:498)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.Java:247)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.Java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.Java:462)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.Java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.Java:584)
1
Rahul Khimasia