我使用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;
}
}
我无法找到的是我该如何处理?我把它放在哪里?
所以更大的问题是,我是朝着正确的方向前进,我的假设是否正确?
答案 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
文件中。参数的值应该是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;
}
}
答案 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;