json 数字格式的Java.util.Date在客户端容易恢复的问题

3bygqnnd  于 2023-06-07  发布在  Java
关注(0)|答案(1)|浏览(115)

这里有一个resteasy rest API的示例。
xml的一部分:

<dependencies>
   <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-grizzly2-http</artifactId>
    </dependency>

    <!-- Jersey DI and core-->
    <dependency>
        <groupId>org.glassfish.jersey.inject</groupId>
        <artifactId>jersey-hk2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.glassfish.hk2</groupId>
        <artifactId>hk2-metadata-generator</artifactId>
        <version>3.0.3</version>
    </dependency>

    <!-- add jackson as json provider -->
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jackson-provider</artifactId>
        <version>2.3.10.Final</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
        <version>${jersey.version}</version>
    </dependency>
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-client</artifactId>
        <version>3.9.3.Final</version>
    </dependency>
</dependencies>

我的资源类的一部分:

@Path("/test")
@GET
@Produces("application/json")
@Consumes("application/json")
public Date test() {
    return new Date();
}

所以当我请求http://localhost:8080/test时,响应是1685343320152而不是日期格式。
哪里错了?

myss37ts

myss37ts1#

我可以回答你的部分问题,解释为什么响应是1685343320152

默认为从epoch开始计数

显然,Jackson默认将java.util.Date对象序列化为自UTC(1970-01- 01 T00:00 Z)中所见的1970年第一时刻的历元引用以来的毫秒计数。

ISO 8601

最好序列化为ISO 8601。使用ObjectMapper将默认格式更改为ISO 8601。

// Source code from: https://www.baeldung.com/jackson-serialize-dates
ObjectMapper mapper = new ObjectMapper() ;
mapper.disable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS ) ;
mapper.setDateFormat( new StdDateFormat().withColonInTimeZone( true ) ) ;

参见baeldung的Jackson Date

java.time

您正在使用有严重缺陷的日期-时间类,这些类在几年前就被JSR 310中定义的现代 java.time 类所取代。
具体地,java.util.DateInstant替换。两者都表示一个时刻,与UTC的偏移量为零小时-分钟-秒,但分辨率分别为毫秒和纳秒。
我强烈建议您考虑使用现代类来取代传统类。

相关问题