1

私は次のクラスを持っています:

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 チケットに基づいて、これは設計上不可能に思えますが、誰かが回避策を持っていれば素晴らしいでしょう。

4

0 に答える 0