タイトルがすべてを物語っています。
フィールド/ゲッター/セッターに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実装を使用しています
ありがとう
デフォルトでは、JAXB implsは、プロパティ(get/setペア)、パブリックフィールド(インスタンス変数)、および注釈付きの非パブリックフィールドをマップされたものとして扱います。フィールドに注釈を付けるだけでは、マップされたプロパティの重複例外が発生します。
フィールドに注釈を付ける場合は、クラスで@XmlAccessorType(XmlAccessType.FIELD)
を指定する必要があります。
詳細情報
セッターメソッドとゲッターメソッドで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)