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

我已经看过很多关于这个问题的文章和SO问题 – 但是我觉得它没有成功。 我的目标是在JavaEE应用程序中使用Jackson作为JSON处理器。 到目前为止我有什么?

的pom.xml

  • 这一个

     org.glassfish.jersey.media jersey-media-json-jackson 2.17  
  • 还是这一个(到底哪一个是正确的?)

      com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider 2.5.2  
  • 加上这个(由于这篇文章 ,因为jackson包中不再存在自动发现):

      org.glassfish.jersey.ext jersey-metainf-services 2.17  

web.xml中

简单的REST注册:

  javax.ws.rs.core.Application 1   javax.ws.rs.core.Application /rest/*  

一个简单的对象

 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应用程序服务器。

我的猜测是你在Glassfish上,它使用MOXy作为默认的JSON提供者。 您可以使用禁用它。

  jersey.config.server.disableMoxyJson true  

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

一些FYI

  • jersey-media-json-jackson实际上使用jackson-jaxrs-json-provider 。 它只是将它包装在JacksonFeature ,并允许自动发现它。
  • 如果它仍然不起作用,您可以尝试创建一个function来处理注册和禁用。 例如

     @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; } }