3

ジェネリックリストをラップするクラスがあります。その一般的なラップされたリストにマップを配置すると、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>

どんな手掛かり?

あいさつ、

フリソ

4

0 に答える 0