在JAX-RS响应中使用ISO-8601日期

肌萎缩症

我正在GlassFish 4上使用Java EE 7构建RESTful Web服务。当序列化包含java.util.Date对象的POJO时,不包括时区信息。

如何自定义对象序列化,以便java.util.Date包含时区信息?

例如,代替此:

{
  "id": 1234,
  "foo": "2014-05-19T13:53:49.392"
}

我宁愿这样:

{
  "id": 1234,
  "foo": "2014-05-19T13:53:49.392+09:30"
}

服务器的时区为GMT + 09:30。

肌萎缩症

这是由MOXy中的一个错误引起的,该错误是GlassFish中JAX-RS的默认JSON(反)序列化器。

解决方法是将JSON提供程序切换到Jackson。

第一步是将这些依赖项添加到构建中:

<!-- Provides JacksonFeature -->
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.8</version>
    <scope>provided</scope>
</dependency>

<!-- Provides ObjectMapper and SerializationConfig -->
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
    <type>jar</type>
</dependency>

下一步,添加JacksonFeature作为提供程序,它将替代MOXy作为JSON序列化程序:

@ApplicationPath("/api/1")
public class ApplicationConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> resources = new java.util.HashSet<>();
        addRestResourceClasses(resources);

        // Add Jackson feature.
        resources.add(org.glassfish.jersey.jackson.JacksonFeature.class);

        return resources;
    }

    private void addRestResourceClasses(Set<Class<?>> resources) {
        // JAX-RS resource classes added here - maintained by NetBeans.
    }
}

Jackson的默认行为是以java.util.Date纪元形式表示的毫秒数。要将其更改为ISO-8601:

import java.text.SimpleDateFormat;
import java.util.TimeZone;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializationConfig;

@Provider
@Produces("application/json")
public class JacksonConfigurator implements ContextResolver<ObjectMapper> {

    public JacksonConfigurator() {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
        dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
        mapper.setDateFormat(dateFormat);
        mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> clazz) {
        return mapper;
    }

    private final ObjectMapper mapper = new ObjectMapper();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在JAX-RS响应中使用ISO-8601日期

来自分类Dev

在MS Access中使用ISO 8601日期

来自分类Dev

ISO 8601日期时间现在

来自分类Dev

python ISO 8601日期格式

来自分类Dev

Swift ISO 8601日期格式

来自分类Dev

使用moment.js验证ISO 8601日期

来自分类Dev

使用PHP更改ISO 8601日期格式

来自分类Dev

信息学ISO-8601日期

来自分类Dev

反序列化ISO 8601日期

来自分类Dev

如何过滤特定年份的ISO 8601日期

来自分类Dev

dashDB:如何从ISO 8601日期创建TIMESTAMP?

来自分类Dev

如何过滤特定年份的ISO 8601日期

来自分类Dev

2个iso8601日期之间的周数

来自分类Dev

使用冒号分隔符格式化ISO 8601日期

来自分类Dev

使用ISO 8601日期格式添加两秒钟

来自分类Dev

使用iOS7的Swift ISO-8601日期格式

来自分类Dev

如何使用JavaScript将ISO 8601日期格式化为更易读的格式?

来自分类Dev

如何使用linux date命令解析ISO8601日期

来自分类Dev

ORA-01821:ISO 8601日期与本地时间的日期格式无法识别错误

来自分类Dev

UI Bootstrap datepicker表示ISO-8601日期字符串的日期无效

来自分类Dev

在JAX-RS中使用Location标头创建响应

来自分类Dev

Google表格单元格中的ISO-8601日期字符串

来自分类Dev

在Java中将ISO8601日期转换为UNIX时间戳

来自分类Dev

有没有办法在Symfony中验证ISO8601日期?

来自分类Dev

在Python中将ISO 8601日期时间转换为秒

来自分类Dev

无法将ISO-8601日期字符串解析为Date

来自分类Dev

将String ISO-8601日期转换为oracle的timestamp数据类型

来自分类Dev

获取LibreOffice Calc或Excel导入ISO8601日期时间的最简单方法

来自分类Dev

xCBL的ISO 8601日期时间是否应包含破折号?

Related 相关文章

热门标签

归档