14

我正在运行 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 注释而不是 Java 字段名称中获取其 JSON 名称。

我想实现 Jackson Full Data Binding (POJO) Example中描述的 JSON 输出。

它在像这样的简单测试中运行良好(使用我的 XML 注释类):

  ObjectMapper mapper = new ObjectMapper(); 
  mapper.writeValue(System.out, myObject);

但嵌入泽西岛我没有得到预期的 JSON 输出。

他们在泽西岛的其他配置选项是否可以获得“简单”的 POJO JSON 表示(因为这最适合必须反序列化 JSON 结果的客户端)。

谢谢克劳斯

详细解决方案

(1)ContextResolver为 Jacksons实现一个ObjectMapper不使用注释的 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"/>
4

1 回答 1

6

在低级别,需要确保 ObjectMapper 不使用 JAXBAnnotationIntrospector,而只使用默认的 JacksonAnnotationIntrospector。我认为您应该能够只构造 ObjectMapper (默认情况下不添加 JAXB 内省),并通过标准 JAX-RS 提供程序机制注册它。这应该覆盖 POJO 映射器功能将以其他方式构建的 ObjectMapper。

于 2011-02-15T19:31:49.360 回答