在 JavaEE 应用程序中使用 Jackson 作为 JAXB-JSON-processor
Use Jackson as JAXB-JSON-processor in JavaEE Application
我看过很多关于此的文章和 SO-questions - 但我就是没有让它工作。
我的目标是在 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 应用服务器。
我猜您使用的是 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 提供程序。
一些供参考
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;
}
}
我看过很多关于此的文章和 SO-questions - 但我就是没有让它工作。 我的目标是在 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 应用服务器。
我猜您使用的是 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 提供程序。
一些供参考
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; } }