在 Vert.x 中使用 Jackson 的 JSON Java 8 LocalDateTime 格式

问题描述 投票:0回答:3

我正在尝试从 LocaLDateTime 创建 json 对象,但由于某种原因它正在创建像这样的 json,查找 issuesAt 和 expireAt 键

json {“userID”:0,“deviceID”:0,“refreshToken”:“93180548-23b3-4d1b-8b5b-a105b7cff7f9”,“issuedAt”:{“year”:2021,“monthValue”:10, “月份”:27,“小时”:9,“分钟”:22,“秒”:31,“纳米”:0,“月份”:“十月”,“星期几”:“星期三”,“年份”: 300,"年表":{"id":"ISO","calendarType":"iso8601"}},"expiresAt":{"year":2021,"monthValue":10,"dayOfMonth":28, “小时”:9,“分钟”:22,“秒”:31,“纳米”:0,“月份”:“十月”,“星期几”:“星期四”,“年份”:301,“年表”: {“id”:“ISO”,“calendarType”:“iso8601”}}}

我希望它像这样

批次:[0,0,29a1bf70-648e-4cb5-aef8-5377cf702875,2021-10-26T12:36:10,2021-10-27T12:36:10].

我创建 2 个日期的代码如下

    String randomString = UUID.randomUUID().toString();
    Instant myInstant1 = Instant.now().truncatedTo(ChronoUnit.SECONDS);
    LocalDateTime issuedAt = LocalDateTime.ofInstant(myInstant1, ZoneId.systemDefault());
    System.out.println("issued_at : " + issuedAt);
    LocalDateTime expiresAt = issuedAt.plusDays(1);
    System.out.println("expires_at: " + expiresAt.plusDays(1));

在下面的代码中,当我尝试使用 mapto 将 json 对象添加到我的类对象时,出现错误。

JsonObject json = new JsonObject()
                    .put("userID", userID)
                    .put("deviceID", deviceID)
                    .put("refreshToken", randomString)
                    .put("issuedAt", issuedAt)
                    .put("expiresAt", expiresAt);
                                    
                                
LOG.info("json {}", json.encode());

RefreshToken refreshTokenObj = json.mapTo(RefreshToken.class); //here I am trying to mapTo my class and I get the error
LOG.info("refreshTokenObj {}", refreshTokenObj);

我得到的错误是

2021-10-27 09:22:31.133+0330 [vert.x-eventloop-thread-1] 错误 com.galiy.main.MainVerticle - 未处理: java.lang.IllegalArgumentException:无法构造

java.time.LocalDateTime
的实例(不存在创建者,如默认构造函数):无法从对象值反序列化(不存在基于委托或属性的创建者) [来源:未知;行:-1,列:-1](通过参考链:com.galiy.security.refreshToken.RefreshToken[“issuedAt”]) 在 com.fasterxml.jackson.databind.ObjectMapper._convert(ObjectMapper.java:4236) ~[jackson-databind-2.11.4.jar:2.11.4]

我的 RefreshToken 模型是这样的,

public class RefreshToken {

private Integer id;
private Integer userID;
private Integer deviceID;
private String refreshToken;
private LocalDateTime issuedAt;
private LocalDateTime expiresAt;
java json jackson vert.x
3个回答
2
投票

我不熟悉

Vert.x
。但根据我们在帖子下的讨论,我只需在
mapTo()
之前添加以下 2 行代码,就没有错误。

ObjectMapper objectMapper = DatabindCodec.mapper();
objectMapper.registerModule(new JavaTimeModule());

控制台输出:

RefreshToken{id=null,userID=0,deviceID=0,refreshToken='9da220ce-bc66-4561-b924-988c7f394f2d',issuedAt=2021-10-27T17:21:28,expiresAt=2021-10-28T17:21 :28}


根据我的经验,您还可以在序列化时配置

ObjectMapper
来处理
LocalDateTime
的输出格式,如下所示:

objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

1
投票

您需要按如下方式注释您的 LocalDateTime 成员:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss")
LocalDateTime myTime

这里是解释所有细节的完整答案的链接:Spring Data JPA - ZonedDateTime format for json Serialization


0
投票
默认情况下不支持

java.time.LocalDateTime
,因此我们必须在使用
mapTo()
功能之前注册模块。 在
json.mapTo(RefreshToken.class);
-

之前添加此行
DatabindCodec.mapper().registerModule(new JavaTimeModule());
© www.soinside.com 2019 - 2024. All rights reserved.