带有 Jersey 2.2 和 Jackson 2.1 的自定义 ObjectMapper [英] Custom ObjectMapper with Jersey 2.2 and Jackson 2.1
问题描述
我正在努力使用 Grizzly、Jersey 和 Jackson 的 REST 应用程序,因为 Jersey 忽略了我的自定义 ObjectMapper.
I am struggling with a REST application with Grizzly, Jersey and Jackson, because Jersey ignores my custom ObjectMapper.
POM 依赖:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-servlet</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.1.4</version>
</dependency>
</dependencies>
最终版本为:Grizzly 2.3.3、Jackson 2.1.4 和 Jersey 2.2.
Resulting versions are: Grizzly 2.3.3, Jackson 2.1.4 and Jersey 2.2.
主类(我想显式注册 Jersey 组件):
Main class (I want explicit registration of Jersey components):
public class Main {
public static void main(String[] args) {
try {
ResourceConfig rc = new ResourceConfig();
rc.register(ExampleResource.class);
rc.register(ObjectMapperResolver.class);
HttpHandler handler = ContainerFactory.createContainer(
GrizzlyHttpContainer.class, rc);
URI uri = new URI("http://0.0.0.0:8080/");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri);
ServerConfiguration config = server.getServerConfiguration();
config.addHttpHandler(handler, "/");
server.start();
System.in.read();
} catch (ProcessingException | URISyntaxException | IOException e) {
throw new Error("Unable to create HTTP server.", e);
}
}
}
ObjectMapper 的上下文解析器:
ContextResolver for ObjectMapper:
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class ObjectMapperResolver implements ContextResolver<ObjectMapper> {
private final ObjectMapper mapper;
public ObjectMapperResolver() {
System.out.println("new ObjectMapperResolver()");
mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
}
@Override
public ObjectMapper getContext(Class<?> type) {
System.out.println("ObjectMapperResolver.getContext(...)");
return mapper;
}
}
ObjectMapperResolver
构造函数和 getContext
都不会被调用.我错过了什么?我更喜欢使用 Jersey 2.2 和 Jackson 2.1,因为它是另一个库的依赖项.
Neither ObjectMapperResolver
constructor nor getContext
get called. What am I missing? I would prefer to use Jersey 2.2 and Jackson 2.1, because it is a dependency for another lib.
完整示例可以在 GitHub 上找到:https://github.com/svenwltr/示例-灰熊-球衣-杰克逊/树/stackoverflow
A full example can be found on GitHub: https://github.com/svenwltr/example-grizzly-jersey-jackson/tree/stackoverflow
推荐答案
我找到了解决方案.我必须自己实例化 Jackson Provider 并设置我的自定义 ObjectMapper
.可以在 GitHub 上找到一个工作示例:https://github.com/svenwltr/example-grizzly-jersey-jackson/tree/stackoverflow-answer
I found a solution. I had to instantiate the Jackson Provider by myself and set my custom ObjectMapper
. A working example can be found on GitHub: https://github.com/svenwltr/example-grizzly-jersey-jackson/tree/stackoverflow-answer
我删除了我的 ObjectMapperResolver
并修改了我的 main
方法:
I deleted my ObjectMapperResolver
and modified my main
method:
public class Main {
public static void main(String[] args) {
try {
// create custom ObjectMapper
ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
// create JsonProvider to provide custom ObjectMapper
JacksonJaxbJsonProvider provider = new JacksonJaxbJsonProvider();
provider.setMapper(mapper);
// configure REST service
ResourceConfig rc = new ResourceConfig();
rc.register(ExampleResource.class);
rc.register(provider);
// create Grizzly instance and add handler
HttpHandler handler = ContainerFactory.createContainer(
GrizzlyHttpContainer.class, rc);
URI uri = new URI("http://0.0.0.0:8080/");
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(uri);
ServerConfiguration config = server.getServerConfiguration();
config.addHttpHandler(handler, "/");
// start
server.start();
System.in.read();
} catch (ProcessingException | URISyntaxException | IOException e) {
throw new Error("Unable to create HTTP server.", e);
}
}
}
这篇关于带有 Jersey 2.2 和 Jackson 2.1 的自定义 ObjectMapper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!