从CXF JAX-RS返回具有名称/值格式的地图

时间:2014-04-14 12:29:06

标签: java jaxb cxf jax-rs

我们想要编写一个看起来像这样的API:

@XmlRootElement(name = "MyData")
@XmlAccessorType(XmlAccessType.FIELD)
public static class MyData {
    public String name;
    public Map<String,String> data;
}

@GET
@Path("/mydata")
public MyData getMyData() {
    MyData ret = new MyData();
    ret.name = "map data";
    ret.data = new HashMap<>();
    ret.data.put("a1", "b1");
    ret.data.put("a2", "b2");
    return ret;
}

但是这里有一个我们似乎无法解决的问题:我们希望它返回一个类似这样的JSON结构:

{
   "MyData":{
      "name":"map data",
      "data":{
         "a1": "b1",
         "a2": "b2"
      }
   }
}

我们无法弄清楚如何超越

之类的东西
{
   "MyData":{
      "name":"map data",
      "data":{
         "entry":[
            {
               "key":"a1",
               "value":"b1"
            },
            {
               "key":"a2",
               "value":"b2"
            }
         ]
      }
   }
}

知道我们怎么做这个吗?我很确定这可以做到,因为我曾经看过它的演示。我们使用的是tomcat,Java 7,CXF 2.7.3和Jackson 2.1.2。两点:

  • 请注意,它不一定必须包含Map:我们需要的是将大量密钥/值放在一起,而这些密钥/值是事先不知道密钥的。
  • 我们必须双向 - 我们需要在表示中使用此语法实现PUT / POST以及GET。

1 个答案:

答案 0 :(得分:0)

如果你只想返回JSON(不支持XML),那么只需从MyData删除所有JAXB注释,你就会得到一个非常好的结构,但没有包装&#34; MyData&#34;元素(这对我来说似乎是多余的)。你可以使用核心Jackson注释,比如@JsonIgnore(而不是JAXB&#39; s)。如果要添加根环绕元素,可以将WRAP_ROOT_VALUE设置为true。