私は次のクラスを持っています:
class A {
Map<String, String> mapping;
public A() {...}
private Map<String, String> getMapping() {...};
private void setMapping(Map<String, String> mapping) { ... };
}
次の表現を使用して、このクラスを XML でシリアル化/逆シリアル化できる必要があります。
<a>
<entry key="foo" value="bar"/>
<entry key="xbaz" value="xklux"/>
</a>
jaxb-introsを使用して、これらのクラスの JAXB を構成します。構成は次のとおりです。
<Class name="A">
<XmlRootElement name="a"/>
<Method name="getMapping">
<XmlElement name="mapping"/>
<XmlJavaTypeAdapter value="MappingAdapter"/>
</XmlMethod>
</Class>
動作しますが、生成されます:
<a>
<mapping>
<entry key="test" value="a"/>
<entry key="mdx.foo" value="bar"/>
</mapping>
</a>
mapping
私の質問は、このひどい要素を取り除くにはどうすればよいですか?
JAXB構成で要素を削除しようとしましたXmlElement
が、結局
<a/>
JAXB はアダプタ コードを呼び出していません。
私の2番目の試みは、別のアダプターAAdapter
(オブジェクトを直接処理することになっているA
)を使用したもので、次のように構成できると思います:
<Class name="A">
<XmlRootElement name="a"/>
<XmlJavaTypeAdapter value="AAdapter"/>
</Class>
しかし、そのmarshal()
メソッドは呼び出されず、JAXB からのエラー メッセージはありません (別の話である JAXB 構成が原因である可能性があります)。そして、次の出力が得られます。
<a/>
が呼び出された場合、要素AAdapter
を直接生成する必要があります。entry
サブ属性の中間マークアップを削除する方法に関する複数の関連投稿を見ましたが、ここでは直接属性の要素を削除したいので、それらは私の問題とは異なるようです。
では、結果を要素に入れずに属性のアダプターを呼び出すにはどうすればよいでしょうか? または、クラスでアダプターを直接呼び出してシリアライズするにはどうすればよいですか?
ご回答ありがとうございます。
編集:この JAXB チケットに基づいて、これは設計上不可能に思えますが、誰かが回避策を持っていれば素晴らしいでしょう。