ジャクソンの XML 注釈を使用して Map を XML にシリアライズしようとしています。マップ キーを要素名として使用し、値を要素値として使用するために、Map を List に変換しています。目的の XML の取得に非常に近づいています。
私のクラスは次のようになります。
@JacksonXmlRootElement(localName = "request")
public class TrackingEvent {
private List<JAXBElement<String>> data = new ArrayList<JAXBElement<String>>();
public TrackingEvent() {}
public TrackingEvent addData(String key, String value) {
data.add(new JAXBElement<String>(new QName(key), String.class, value));
return this;
}
public Map<String, String> getData() {
Map<String, String> dataAsMap = new HashMap<String, String>(data.size());
for (JAXBElement<String> elem : data) {
dataAsMap.put(elem.getName().getLocalPart(), elem.getValue());
}
return Collections.unmodifiableMap(dataAsMap);
}
}
私のテストコード(実際のテストではなく、クイックアンドダーティ):
@RunWith(JUnit4.class)
public class TrackingEventMapperTest {
@Test
public void eventToXml() throws Exception {
TrackingEvent e = new TrackingEvent().addData("eVar17", "woohoo");
XmlMapper mapper = new XmlMapper();
mapper.configure(JsonGenerator.Feature.AUTO_CLOSE_TARGET, false);
mapper.configure(ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true);
System.out.println("\n" +
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(e));
}
}
生成される XML は次のとおりです。
<?xml version='1.0' encoding='UTF-8'?>
<request>
<data>
<eVar17>woohoo</eVar17>
</data>
</request>
しかし、私が探しているのは次のとおりです。
<?xml version='1.0' encoding='UTF-8'?>
<request>
<eVar17>woohoo</eVar17>
</request>
データ宣言とそのゲッターの両方に @JacksonXmlElementWrapper(useWrapping = false) 注釈を追加しようとしましたが、何もしないようです。@JacksonXmlProperty(localName = "moop") を宣言/ゲッターに追加して要素の名前を変更できますが、完全に除外する方法がわかりません。
Jackson の docsを読んでも JAXB アノテーションを使用できると確信していますが、Google 経由でも何も見つかりませんでした。
ご想像のとおり、私は Omniture データを表す XML ドキュメントを作成しようとしており、すべての eVar 変数と prop 変数を POJO に明示的に含める必要がない方法で送信しようとしています。
私の解決策
必要な XML はそれほど複雑ではないため、Jackson の使用を放棄することにしましたが、Jackson に自分のやりたいことを強制することはますます複雑になっていました。私は STAX2 を使用して、Jackson が内部で使用しているのと同じ実装を使用して XML を直接記述することにしました。これにより、必要に応じて XML をカスタマイズできます。
Blaiseの答えは、私が望んでいたことを正確に行ったように思えました。