我正在运行Jersey REST服务。代表我的资源的POJO是带有JAXB(XML)注释的简单Java类(它们是从模式定义生成的-因此具有注释)。
我希望Jersey / Jackson忽略XML注释。我确实在我的web.xml这个配置(如提到这里):
<init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param>
我现在希望@XMLElement批注不再用于JSON字段命名策略。
但是看这个java领域(成员)
@XmlElement(name = "person", required = true) protected List<Person> persons;
我仍然得到以下JSON表示形式:
....,"person":[{"name":"FooBar", ....... (person without the 's')
所有其他字段也仍然从@XmlElement批注中获取其JSON名称,而不是从Java字段名称中获取。
我想实现JSON输出,如Jackson 完整数据绑定(POJO)示例中所述。
在像这样的简单测试中(使用带XML注释的类),它可以正常工作:
ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(System.out, myObject);
但是嵌入在Jersey中,我没有得到预期的JSON输出。
它们在Jersey中的其他配置选项是获得“简单”的POJO JSON表示形式(因为这最适合必须反序列化JSON结果的客户端)。
谢谢克劳斯
详细的解决方案
(1)ContextResolver为Jacksons 实现一个,ObjectMapper它创建一个不使用注释的ObjectMapper。
ContextResolver
ObjectMapper
package foo.bar.jackson; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.ext.ContextResolver; import javax.ws.rs.ext.Provider; import org.codehaus.jackson.map.DeserializationConfig; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; /** * Customized {@code ContextResolver} implementation that does not use any * annotations to produce/resolve JSON field names. */ @Provider @Produces(MediaType.APPLICATION_JSON) public class JacksonContextResolver implements ContextResolver<ObjectMapper> { private ObjectMapper objectMapper; /** * Creates a new instance. * * @throws Exception */ public JacksonContextResolver() throws Exception { this.objectMapper = new ObjectMapper().configure( DeserializationConfig.Feature.USE_ANNOTATIONS, false) .configure(SerializationConfig.Feature.USE_ANNOTATIONS, false); ; } /** * @see javax.ws.rs.ext.ContextResolver#getContext(java.lang.Class) */ public ObjectMapper getContext(Class<?> objectType) { return objectMapper; } }
(2)在您的application.xml中注册ContextResolver Spring bean
<bean class="foo.bar.jackson.JacksonContextResolver"/>
在低级别,需要执行什么操作以确保ObjectMapper不使用JAXBAnnotationIntrospector,而仅使用默认的JacksonAnnotationIntrospector。我认为您应该能够构造ObjectMapper(默认情况下不添加JAXB内省器),并通过标准JAX- RS提供程序机制对其进行注册。这应该覆盖POJO映射器功能否则会构造的ObjectMapper。