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

ins*_*how 9 java json resteasy jackson

我使用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;
        }
     }
Run Code Online (Sandbox Code Playgroud)

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

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

gre*_*ker 17

您需要ContextResolver使用Resteasy 注册您的实施.您可以通过使用注释对类进行@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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

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

通过web.xml注册

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

<context-param>
      <param-name>resteasy.providers</param-name>
      <param-value>foo.contextresolver.JacksonConfig</paramvalue>
</context-param> 
Run Code Online (Sandbox Code Playgroud)

通过应用程序注册

如果您使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

更多关于独立配置的信息


Fab*_*rli 6

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

添加依赖:

<dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-jsr310</artifactId> 
     <version>2.4.0</version> 
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

@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;
} }
Run Code Online (Sandbox Code Playgroud)