在JavaEE应用程序中使用Jackson作为JAXB-JSON处理器

时间:2015-04-17 11:50:06

标签: java jaxb jersey jackson jax-rs

我已经看过很多关于此事的文章和SO问题 - 但我只是觉得它不起作用。 我的目标是在JavaEE应用程序中使用Jackson作为JSON处理器。到目前为止我有什么?

的pom.xml

  • 这一个

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.17</version>
    </dependency>
    
  • 或者这个(到底哪一个是正确的?)

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.5.2</version>
    </dependency>
    
  • 加上这个(由于this article,因为jackson包中不再存在自动发现):

    <dependency>
        <groupId>org.glassfish.jersey.ext</groupId>
        <artifactId>jersey-metainf-services</artifactId>
        <version>2.17</version>
    </dependency>
    

的web.xml

简单的REST注册:

<servlet>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>javax.ws.rs.core.Application</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>

一个简单的对象

import com.fasterxml.jackson.annotation.JsonProperty;

public class Dummy {
    private String name;

    @JsonProperty("username")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

REST资源

@GET
@Path("test")
@Produces(MediaType.APPLICATION_JSON)
public Response getRequest() {
    Dummy dummy = new Dummy();
    dummy.setName("rolf");

    return Response.ok(dummy).build();
}

输出

{"name":"rolf"}

而不是预期的

{"username":"rolf"}

更新

我正在使用GlassFish应用程序服务器。

1 个答案:

答案 0 :(得分:2)

我的猜测就是Glassfish,它使用MOXy作为默认的JSON提供程序。您可以使用<init-param>停用它。

<init-param>
    <param-name>jersey.config.server.disableMoxyJson</param-name>
    <param-value>true</param-value>
</init-param>

jersey-media-json-jackson具有可自动发现的功能,应自动注册。我不确定Glassfish的自动发现功能,以及内部使用的可能较低版本的Jersey,如果它不会被注册。但无论哪种方式,您配置web.xml的方式是启用类路径扫描,因此无论如何都应该选择Jackson提供商。

部分FYI

  • jersey-media-json-jackson实际使用jackson-jaxrs-json-provider。它只是将它包装在JacksonFeature中,并启用它的自动发现。
  • 如果仍然无效,您可以尝试创建一个功能来处理注册和禁用。例如

    @Provider
    public class JsonFeature implements Feature {
        @Override
        public boolean configure(FeatureContext context) {
            context.property("jersey.config.server.disableMoxyJson", true);
            // this is in jersey-media-json-jackson
            context.register(JacksonFeature.class);
    
            // or from jackson-jaxrs-json-provider
            context.register(JacksonJsonProvider.class);
            // for JAXB annotation support
            context.register(JacksonJaxbJsonProvider.class);
    
            return true;
        }
    }