首页 文章

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

提问于
浏览
9

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

似乎RESTEasy曾经使用Jettison进行JSON序列化,但是从我一直在阅读的内容中他们已经切换到 Jackson ......所有这一切都让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 回答

  • 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>
    

    NOTE: 如果要在JBoss 7中部署它,请不要设置 resteasy.scan context参数,因为默认情况下它已启用 .

    通过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

  • 6

    使用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;
    } }
    
  • 0

    只需注释你的字段(注意字符串文字可以从常量中外化/引用):

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

相关问题