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

时间:2013-10-07 15:58:10

标签: java json jackson resteasy

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

似乎RESTEasy曾经使用Jettison进行JSON序列化,但是从我一直在阅读的内容中他们已经切换到杰克逊......所有这一切都让google搜索得到了很好的帮助。

据我所知,我需要按照以下方式实现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;
        }
     }

我无法找到的是我该如何处理?我把它放在哪里?

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

3 个答案:

答案 0 :(得分:17)

您需要在Resteasy中注册ContextResolver实施。您可以通过使用@Provider注释对类进行批注并允许Resteasy在启动期间自动扫描它,在web.xml中注册它,或者在扩展javax.ws.rs.core.Application的类中注册它(如果是你如何引导Resteasy)。

通过注释注册

@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上下文参数,因为默认情况下它已启用。

通过web.xml注册

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

<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;
    }
}

More on standalone configuration HERE

答案 1 :(得分:6)

使用JSR310(新api日期) - LocalDate,LocalDateTime,LocalTime

添加依赖:

@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;
} }

创建一个注册模块的提供者:

$devices

答案 2 :(得分:0)

只需用以下注释字段(请注意,字符串文字可以外部化/从常量引用):

@javax.json.bind.annotation.JsonbDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
Date myDate;