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

Java 使用RESTEasy 3.x更改默认JSON时间格式,java,json,jackson,resteasy,Java,Json,Jackson,Resteasy,我正在使用RESTEasy实现一个使用JSON序列化的REST服务。目前,自1970年以来,日期被序列化为毫秒。为了提高兼容性,我想把我的约会转换成两种格式之一;毫秒+时区偏移或ISO 8061 RESTEasy似乎曾经使用抛弃来实现JSON序列化,但从我所阅读的内容来看,他们已经切换到Jackson了。。。所有这些都让谷歌的求助变得非常随意 据我所知,我需要实现一个ContextResolver,大致如下: public class JacksonConfig impelments C

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

RESTEasy似乎曾经使用抛弃来实现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;
        }
     }
公共类JacksonConfig驱动上下文解析器
{
私有最终OBjectMapper OBjectMapper;
公共JacksonConfig()引发异常
{
objectMapper=新建objectMapper.configure(
SerializationFeature.WRITE_DATE_作为时间戳,false);
}
@凌驾
公共对象映射器getContext(类arg0)
{
返回对象映射器;
}
}
我没能找到的是,我该怎么处理这个?我应该把它放在哪里


因此,更大的问题是,我的方向正确吗?我的假设正确吗?

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

通过注释注册 通过应用程序注册 如果您使用应用程序类配置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;
    }
}
公共类MyApp扩展应用程序
{
@凌驾
publicset>Set=newhashset与JSR310(新api日期)一起使用-LocalDate、LocalDateTime、LocalTime

添加依赖项:

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

com.fasterxml.jackson.datatype
jackson-datatype-jsr310
2.4.0 
并创建一个提供程序来注册模块:

@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;
} }
@Provider
公共类JacksonConfig实现ContextResolver{
私有最终ObjectMapper ObjectMapper;
公共JacksonConfig()引发异常{
objectMapper=新的objectMapper()
.disable(SerializationFeature.WRITE_DATES_作为时间戳)
.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_为_纳秒)
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.registerModule(新的JSR310Module());
}
@凌驾
公共对象映射器getContext(类arg0){
返回对象映射器;
} }

只需在字段中添加注释(注意字符串文字可以外部化/引用自常量):


感谢这篇文章,我已经做了很多,但仍然没有解决问题。我看到我的JacksonConfig构造函数被调用,但我从来没有看到getContext方法被调用。如果有用的话,我正在Jetty中使用WebApplicationContext并通过web.xml注册。我看到构造的事实让我认为web.xml是正确的正确…只是缺少了最后一点。我修复了它…我使用的是RESTEasy 3.0.4。我回滚到2.3.5,一切都正常。感谢帮助!现在打开一个RESTEasy bug。对于迁移到Wildfly 8.1.0/RESTEasy 3.0.8,由提供商进行的相同注册应该可以工作,但导入更改为
com.fasterxml.jackson.databind.SerializationFeature
由于使用了Jackson 2。不适用于我…我在wildfly 8.1.0中使用resteasy 3.0.8,使用com.fasterxml.Jackson.databind.SerializationFeature ObjectMapper中的configure方法yelds类型ObjectMapper中的configure(SerializationConfig.Feature,boolean)方法不适用于参数(SerializationFeature,boolean)将WildFly 21与Jave EE 8结合使用,这比所有其他解决方案都好得多……Tnx!
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;
    }
}
<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;
} }
@javax.json.bind.annotation.JsonbDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
Date myDate;