如何精确匹配cxf的json输出?

时间:2011-02-04 10:22:20

标签: java json cxf jax-rs jackson

编辑: 我很困惑 - 使用的是cxf,而不是jersey。有没有办法将带注释的对象转换为类似于jackson的ObjectMapper的json?

原始消息:

您好, 我们目前正在使用jaxrs将我们的Web响应转换为xml / json。但是,我现在要做的是使用ObjectMapper(?)在我的代码中生成一个等效的json字符串。

例如,给定一个控制器和带有jaxb注释的返回对象:

@Path("/foo")
@Produces({"application/json", "application/xml"})
public class FooController {

    @GET
    @Path("/some_action")
    public TopDTO someAction(@QueryParam("arg") String arg) {
        ...
    }
}

@XmlRootElement(name="topDTO")
@XmlAccessorType(XmlAccessType.NONE)
public class TopDTO {
    ...
    @XmlAttribute(name="attr")
    public String getAttr() {
        return "blah";
    }
    @XmlElement(name="innerDTO")
    public InnerDTO getInnerDTO() {
       ...
    }
}

@XmlRootElement(name="innerDTO")
@XmlAccessorType(XmlAccessType.NONE)
public class InnerDTO {
    ...  
}

点击http://myserver/.../foo.json会发出一些漂亮的json:

{"topDTO":{"@attr":"blah","innerDTO":...}}

现在我希望能够在内部生成精确的json:

ObjectMapper mapper = new ObjectMapper();
AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();
mapper.getSerializationConfig().setAnnotationIntrospector(introspector);
mapper.getSerializationConfig().setSerializationInclusion(Inclusion.ALWAYS);            
mapper.getSerializationConfig().set(SerializationConfig.Feature.AUTO_DETECT_FIELDS, false);
mapper.getSerializationConfig().set(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
return mapper.writeValueAsString(snapshotDTO);

但是,这似乎根本不起作用;大多数带注释的属性和元素都缺失,属性没有前缀为“@”,因为它们与jaxrs输出等等。

我错过了一些简单的东西吗? jaxrs本身如何将带注释的对象转换为json字符串?

谢谢! 乔

3 个答案:

答案 0 :(得分:3)

使用JSONJAXBContextcreate a marshaller并使用它将对象序列化为JSON格式。我认为你不需要杰克逊。

  JSONJAXBContext c = create the context
  JSONMarshaller m = c.createJSONMarshaller();
  YourJAXBObject obj = your object
  StringWriter writer = some writer
  m.marshallToJSON(obj, writer);

答案 1 :(得分:2)

实际上,您不仅使用CXF,还没有使用Jackson的json序列化。为什么?因为杰克逊不会在声明为属性的事物前添加“@”。

如果你想使用ObjectMapper,你可能想要从默认值开始,并尝试根据你想要改变的东西来改变,而不是从一组配置覆盖开始(例如:你正在禁用getter / setter)自动检测,看起来不像你应该做的事情。)

答案 2 :(得分:0)

是。可以将杰克逊设置为http://cxf.apache.org/docs/jax-rs-data-bindings.html中的提供者 。我观察到杰克逊在很多方面都很简单方便。