亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

無法構造 java.time.LocalDateTime 的實例 - Jackson

無法構造 java.time.LocalDateTime 的實例 - Jackson

郎朗坤 2022-06-15 15:21:05
我有兩個通過 JMS 消息傳遞和 ActiveMQ 進行通信的 Spring Boot 應用程序。一個應用程序向另一個應用程序發送一個包含 LocalDateTime 屬性的對象。該對象被序列化為 JSON,以便發送到其他應用程序。我面臨的問題是杰克遜在嘗試將傳入的 json 映射到我的對象時無法反序列化 LocalDateTime 屬性。LocalDateTime 屬性在到達“偵聽器應用程序”時具有以下格式:"lastSeen":{  "nano":0,  "year":2019,  "monthValue":4,  "dayOfMonth":8,  "hour":15,  "minute":6,  "second":0,  "month":"APRIL",  "dayOfWeek":"MONDAY",  "dayOfYear":98,  "chronology":{    "id":"ISO",    "calendarType":"iso8601"  }}我得到的例外如下:org.springframework.jms.support.converter.MessageConversionException: Failed to convert JSON message content; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of java.time.LocalDateTime我可以通過使用以下注釋暫時解決此問題:@JsonSerialize(as = LocalDateTimeSerializer.class)@JsonDeserialize(using = LocalDateTimeDeserializer.class, as = LocalDateTime.class)private LocalDateTime lastSeen;但它們屬于杰克遜數據類型 jsr310現在已棄用。是否有任何方法/替代方法可以在不使用上述注釋的情況下反序列化此 LocalDateTime 屬性?或者我如何使用推薦的jackson-modules-java8 讓它工作?
查看完整描述

2 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

我記得舊版本的spring沒有這個問題(或者我很幸運)但這就是我在Spring boot 2.1.7.RELEASE中解決它的方法:


首先,添加Jackson 的支持模塊以支持 Java 8 功能(TimeDate API)


    <dependency>

        <groupId>com.fasterxml.jackson.module</groupId>

        <artifactId>jackson-module-parameter-names</artifactId>

    </dependency>

    <dependency>

        <groupId>com.fasterxml.jackson.datatype</groupId>

        <artifactId>jackson-datatype-jdk8</artifactId>

    </dependency>

    <dependency>

        <groupId>com.fasterxml.jackson.datatype</groupId>

        <artifactId>jackson-datatype-jsr310</artifactId>

    </dependency>

然后在 Spring 中注冊一個帶有自定義配置(以支持 Java 8)的默認 ObjectMapper bean。


@Bean

@Primary

public ObjectMapper geObjMapper(){

    return new ObjectMapper()

            .registerModule(new ParameterNamesModule())

            .registerModule(new Jdk8Module())

            .registerModule(new JavaTimeModule());

}

注意:@Primary 用作預防措施,因此如果類路徑上有其他 ObjectsMapper bean,spring 將默認選擇這個。


查看完整回答
反對 回復 2022-06-15
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

您編寫的解決方案是正確的方法。其他方法如下所述。公共類 LocalDateTimeSerializer 實現 JsonSerializer { @Override public JsonElement serialize(LocalDateTime localDateTime, Type type, JsonSerializationContext jsonSerializationContext) { Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant(); 日期日期 = Date.from(instant); 返回新的 JsonPrimitive(date.getTime()); } }


GsonBuilder gsonBuilder = new GsonBuilder();

gsonBuilder.registerTypeAdapter(LocalDateTime.class, new LocalDateTimeSerializer());


Gson gson = gsonBuilder.create();

另一種方法。無論如何試試這個。嘗試將日期時間格式更改為字符串?!?011-04-08T09:00:00”。nano 和其他格式非常復雜,我無法從你 lastseen json 中看出你到底在說什么日期時間。它也錯過了時區,因此您的本地時間可以在您部署解決方案的任何地方,如果您在 3 個不同的時區機器上部署本地時間是不正確的。使用此字符串格式或制作您自己的“2011-04-08T09:00:00”


public class CustomJsonDateDeserializer extends JsonDeserializer<Date>

{

    @Override

    public Date deserialize(JsonParser jsonParser,

            DeserializationContext deserializationContext) throws IOException, JsonProcessingException {


        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");

        String date = jsonParser.getText();

        try {

            return format.parse(date);

        } catch (ParseException e) {

            throw new RuntimeException(e);

        }


    }


}


@JsonDeserialize(using = CustomJsonDateDeserializer.class)


查看完整回答
反對 回復 2022-06-15
  • 2 回答
  • 0 關注
  • 563 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號