我已经看过很多关于此事的文章和SO问题 - 但我只是觉得它不起作用。 我的目标是在JavaEE应用程序中使用Jackson作为JSON处理器。到目前为止我有什么?
这一个
<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>
简单的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;
}
}
@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应用程序服务器。
答案 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;
}
}