使用 RESTEasy 3.x 更改默认 JSON 时间格式

2022-09-04 07:48:49

我正在使用 RESTEasy 通过 JSON 序列化实现 REST 服务。目前,自 1970 年以来,日期被序列化为毫秒。为了提高兼容性,我想将我的日期设置为两种格式之一;毫秒 + 时区偏移量或 ISO 8061。

似乎RESTEasy曾经使用Jettison进行JSON序列化,但是从我一直在阅读的内容来看,他们已经切换到Jackson...所有这些都使谷歌搜索帮助变得非常成功或未命中。

据我所知,我需要按照以下方式实现一个 ContextResolver:

    public class JacksonConfig impelments ContextResolver<ObjectMapper>
    {
        private final OBjectMapper objectMapper;

        public JacksonConfig() throws Exception
        {
            objectMapper = new ObjectMapper.configure(
                               SerializationFeature.WRITE_DATE_AS_TIMESTAMPS, false);
        }

        @Override
        public ObjectMapper getContext(Class<?> arg0)
        {
            return objectMapper;
        }
     }

我无法找到的东西是,我该怎么办?我把它放在哪里?

因此,更大的问题是,我是否朝着正确的方向前进,我的假设是否正确?


答案 1

您需要在 Resteasy 注册您的实现。为此,您可以使用注释注释您的类,并允许Resteasy在启动期间自动扫描它,在web.xml中注册它,或者在扩展的类中注册它(如果这是你引导Resteasy的方式)。ContextResolver@Providerjavax.ws.rs.core.Application

通过注释注册

@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper>
{
    private final ObjectMapper objectMapper;

    public JacksonConfig() throws Exception
    {
        objectMapper = new ObjectMapper.configure(
                           SerializationFeature.WRITE_DATE_AS_TIMESTAMPS, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> arg0)
    {
        return objectMapper;
    }
 }

验证是否在 Web.xml 文件中启用了类路径扫描,如下所示:

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>

注意:如果要在 JBoss 7 中部署此参数,请不要设置上下文参数,因为它在缺省情况下处于启用状态。resteasy.scan

通过网站注册.xml

将以下上下文参数添加到文件中。参数的值应为 的完全限定类名。web.xmlContextResolver

<context-param>
      <param-name>resteasy.providers</param-name>
      <param-value>foo.contextresolver.JacksonConfig</paramvalue>
</context-param> 

通过应用程序注册

如果您使用 Application 类来配置 Resteasy,则可以将提供程序添加到服务集中,并将提供程序添加到 Resteasy 中以注册,如下所示:

public class MyApp extends Application 
{
    @Override
    public Set<Class<?>> getClasses() 
    {
        HashSet<Class<?>> set = new HashSet<Class<?>>(2);
        set.add(JacksonConfig.class);
        set.add(MyService.class);
        return set;
    }
}

有关独立配置的更多信息 这里


答案 2

与 JSR310(新 api 日期)一起使用 - LocalDate、LocalDateTime、LocalTime

添加依赖关系:

<dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-jsr310</artifactId> 
     <version>2.4.0</version> 
</dependency>

并创建一个提供程序来注册模块:

@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper> {
private final ObjectMapper objectMapper;

public JacksonConfig() throws Exception {

    objectMapper = new ObjectMapper()
                .disable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS )
                .disable( SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS )
                .setSerializationInclusion( JsonInclude.Include.NON_NULL )
                .registerModule( new JSR310Module() );

}

@Override
public ObjectMapper getContext( Class<?> arg0 ) {
    return objectMapper;
} }