3

我有一个包含通用列表的类。当我将 Map 放入该通用包装列表中时,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