ジェネリックリストをラップするクラスがあります。その一般的なラップされたリストにマップを配置すると、JAXB出力は私が期待するものではありません。アイテムは表示されますが、内容は表示されません。
詳述すると:私のクラスの簡略化されたバージョン:
@XmlRootElement @XmlSeeAlso({HashMap.class, ArrayList.class, Dummy.class})
public static class TargetClass<T> {
public List<T> wrapped = new ArrayList<>();
}
ラップされたリストにマップが含まれている場合、結果は私が期待するものではありません。使用:
@GET @Produces(MediaType.APPLICATION_XML)
public TargetClass<Map<String, String>> thisIsWhatIWant() {
Map<String, String> map = new HashMap<>();
map.put("hello", "world");
TargetClass<Map<String, String>> result = new TargetClass<>();
result.wrapped.add(map);
result.wrapped.add(map);
return result;
}
私は得る:
<targetClass>
<wrapped xsi:type="hashMap"/>
<wrapped xsi:type="hashMap"/>
</targetClass>
しかし、私は望んでいました
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<targetClass>
<wrapped>
<entry>
<key>hello</key>
<value>world</value>
</entry>
</wrapped>
<wrapped>
<entry>
<key>hello</key>
<value>world</value>
</entry>
</wrapped>
</targetClass>
ここにはJAXBの良い答えがたくさんあります(@ blaise-doughanなどに感謝します)が、私が見つけた限りでは、これではありません。
私が試した他のこと:リストとマップは、直接使用した場合に期待するようにシリアル化されます
@GET @Path("baseTest") @Produces(MediaType.APPLICATION_XML)
public BaseTest thisWorksAsExpected() {
BaseTest baseTest = new BaseTest();
baseTest.list.add("item");
baseTest.list.add("item");
baseTest.map.put("hello", "world");
baseTest.map.put("foo", "bar");
return baseTest;
}
出力
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<baseTest>
<list>item</list>
<list>item</list>
<map>
<entry>
<key>hello</key>
<value>world</value>
</entry>
<entry>
<key>foo</key>
<value>bar</value>
</entry>
</map>
</baseTest>
XMLRootElementをそこにドロップすると、TargetClassは期待どおりに機能します。
@XmlRootElement
public static class Dummy {
public String a = "a";
public String b = "b";
}
@GET @Path("other") @Produces(MediaType.APPLICATION_XML)
public TargetClass<Dummy> other() {
TargetClass<Dummy> result = new TargetClass<>();
result.wrapped.add(new Dummy());
result.wrapped.add(new Dummy());
return result;
}
出力:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<targetClass>
<wrapped xsi:type="dummy">
<a>a</a>
<b>b</b>
</wrapped>
<wrapped xsi:type="dummy">
<a>a</a>
<b>b</b>
</wrapped>
</targetClass>
どんな手掛かり?
あいさつ、
フリソ