我正在与Grizzly、Jersey和Jackson一起使用REST应用程序,因为Jersey忽略了我的自定义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>
字符串
生成的版本为:灰熊2.3.3Jackson2.1.4泽西2.2
主类(我想明确注册Jersey组件):
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:
@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和Jackson2.1,因为它是另一个库的依赖项。
完整的例子可以在GitHub上找到:https://github.com/svenwltr/example-grizzly-jersey-jackson/tree/stackoverflow
8条答案
按热度按时间t5zmwmid1#
以下解决方案适用于以下堆栈(如...这是我用来测试它的设置)
新泽西2.12,Jackson2.4.x
我添加了我的消息w/解决方案,我已经想出了这个职位,因为它是相当相关的许多谷歌搜索,我已经把今天...这是一个繁琐的解决方案,我认为是一个更繁琐的问题。
1.确保您的maven配置包含
jackson-jaxrs-json-provider
依赖项:字符串
2.确保您的maven配置不包含
jersey-media-json-jackson
依赖项:型
3.创建一个扩展
com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider
的@Provider
组件,如下所示:型
正如您所看到的,这也是我们定义
com.fasterxml.jackson.databind.ObjectMapper
的自定义示例的地方4.通过
MarshallingFeature
扩展javax.ws.rs.core.Feature
,如下所示:型
5.如果您通过
org.glassfish.jersey.server.ResourceConfig
如下配置您的应用程序,则需要如下注册此自定义提供程序:型
其他注解和观察结果:
1.无论您是否使用
javax.ws.rs.core.Response
来 Package 控制器的响应,此解决方案都适用。1.请确保您仔细考虑(复制/粘贴)以下代码片段,因为可以说只有“非强制性”位是与
com.fasterxml.jackson.databind.ObjectMapper
的自定义配置有关的位。@杰森
很抱歉在这件事上丢了球,我希望你仍然是古董。所以我检查了去年的代码,这是我提出的w/提供一个自定义Map器。
问题是,在要素初始化期间,任何自定义对象Map器都会被
jersey.jackson. jackson特性:77(新泽西-媒体-json-jackson-2.12.jar)
型
但此功能仅由此组件注册
org.glassfish.jersey.jackson.internal.可自动发现的Jackson
型
所以我所做的是注册我自己的特性,它注册我自己的对象Map器提供程序,并在一个绊网中放置阻止org.glassfish.jersey.Jackson.jacksonFeature被注册并覆盖我的对象Map器...
型
这里是自定义对象Map器提供程序...
型
acruukt92#
我找到了解决办法。我必须自己示例化JacksonProvider并设置自定义
ObjectMapper
。可以在GitHub上找到一个工作示例:https://github.com/svenwltr/example-grizzly-jersey-jackson/tree/stackoverflow-answer我删除了我的
ObjectMapperResolver
并修改了我的main
方法:字符串
c3frrgcw3#
我发现了这一点,基于一点修补。
问题似乎出在Jersey的功能自动检测机制中。如果您依赖Jersey来加载JacksonJaxbJsonProvider,那么ObjectMapper的自定义上下文提供程序将被忽略。相反,如果您手动注册该功能,则可以正常工作。我假设这与自动检测到的提供程序被加载到不同的上下文作用域有关,但作为解决方案,我最终得到了以下结果。请注意,我将其 Package 到一个特性中,您应该能够直接将其注册到您的应用程序中,而不会出现问题。
字符串
2017年11月更新:在Jersey2的世界里,事情发生了一些变化。如果上面的不起作用,试试这个:
提供自己的ObjectMapper的新方法现在看起来像这样:
型
jyztefdp4#
请这样做:
1)添加pom.xml依赖项
字符串
2)在Main.java注册JacksonFeature
型
3)在资源中使用Jackson
型
l3zydbqr5#
由于我花了几个小时才在Java EE7和Glassfish4上实现这一点,以下是我的解决方案:
字符串
唯一相关的POM依赖项是:
型
ovfsdjhp6#
来自Jersey 2.17文档:https://eclipse-ee4j.github.io/jersey.github.io/documentation/2.17/media.html#jackson-registration
在应用程序中
字符串
编辑,忘记添加您在register(..)中提供的JacksonObjectMapperProvider:
型
gajydyqb7#
在Jackson2.7中,这样做并不奏效:
字符串
调用了MyObjectMapperProvider构造函数,但从未调用getContext()。
在super()构造函数中注册MyObjectMapperProvider使其工作:
型
请参阅this Jersey example code。
jdzmm42g8#
如果您正在寻找一个解决方案的泽西岛3+。您需要Jackson的Jakarta Provider Dependency。正如Filip在他的回答中所说,请注意,您只有一个json提供程序,即依赖项中的jaxrs提供程序。(确保您的pom.xml没有包含“jersey-media-json-jackson”提供程序。
字符串
基于krotscheck中的代码示例,您现在可以为Jersey 3+创建JacksonFeature。
型
在客户端中注册此功能:
型