gpt4 book ai didi

jackson - 在 Jax-RS 应用程序中注册 JodaModule

转载 作者:行者123 更新时间:2023-12-01 12:36:15 25 4
gpt4 key购买 nike

我正在使用 Jersey 和 Jackson2 编写 Jax-RS 应用程序以促进 JSON i/o。该服务本身运行良好,但我想通过让 jackson 映射器自动序列化/反序列化日期和日期时间到 JodaTime 对象来改进它。

我正在关注文档 here并添加了相关的 jar ,但我迷失了这条指令:

Registering module

To use Joda datatypes with Jackson, you will first need to register the module first (same as with all Jackson datatype modules):

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());

我尝试在扩展 jax.ws.rs.core.Application 的自定义类中执行此操作,但我对该解决方案完全没有信心。我目前收到此错误:
Can not instantiate value of type [simple type, class org.joda.time.DateTime] from String value ('2014-10-22'); no single-String constructor/factory method
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@3471b6d5; line: 7, column: 25]

除了这个模块注册需要在应用程序(servlet?)启动时发生的一般印象之外,我不知道如何处理这些信息。我是否需要用一些特别的东西来注释自定义类才能将其拾取?我应该扩展一些类(class)吗?

我在 StackOverflow 上找到的示例通常粘贴在 main() 中。并直接调用映射器,但我依赖于 jackson 数据绑定(bind),所以这些例子不相关。任何方向表示赞赏。

最佳答案

您基本上想要创建/配置/返回 ObjectMapper ContextResolver .就像是

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

final ObjectMapper mapper = new ObjectMapper();

public ObjectMapperContextResolver() {
mapper.registerModule(new JodaModule());
}

@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}

如果您使用包扫描来发现您的资源,那么 @Provider注释也应该允许这个类被发现和注册。

基本上会发生什么, MessageBodyReader MessageBodyWriter 由 Jackson 提供,分别用于解码和编码,将调用 getContext ContextResolver 中的方法,确定 ObjectMapper使用。读取器/写入器将传入类(在读取器中,它将是方法参数中预期的类型,在写入器中,它将是作为响应返回的类型),这意味着我们可以使用不同的方式已配置 ObjectMapper对于不同的类别,如 seen here .在上述解决方案中,它用于所有类。

关于jackson - 在 Jax-RS 应用程序中注册 JodaModule,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29523169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com