编辑:我很困惑——使用的是 cxf,而不是球衣。有没有办法将带注释的对象转换为类似于杰克逊的 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 字符串?
谢谢!乔