在Jax RS应用程序中注册JodaModule



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

我遵循这里的文档,并添加了相关的罐子,但我对以下说明感到困惑:

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?)启动时进行的一般印象之外,我不知道该如何处理这些信息。我需要用特定的东西来注释自定义类吗?我应该延长一节课吗?

我在StackOverflow上找到的示例通常将其粘贴在main()中并直接调用映射器,但我依赖于Jackson Databinding,因此这些示例并不相关。欢迎任何指示。

您基本上需要在ContextResolver中创建/配置/返回ObjectMapper。类似的东西

@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注释也应该允许发现和注册此类。

基本上,Jackson提供的MessageBodyReaderMessageBodyWriter,分别用于解组和编组,将调用ContextResolver中的getContext方法,以确定要使用的ObjectMapper。读取器/写入器将传入类(在读取器中,它将是方法参数中预期的类型,在写入器中,它是响应中返回的类型),这意味着我们可以对不同的类使用不同配置的ObjectMapper,如图所示。在上面的解决方案中,它用于所有类。

最新更新