簡體   English   中英

傑克遜的 InvalidDefinitionException

[英]InvalidDefinitionException with jackson

在 Spring Boot 2.2.2、java 11 中,通過 Ibm mq 接收對象。

接收到的對象具有 LocalDate 數據類型。

項目在 maven 中有 spring-boot-starter-web starter。

我在項目中看到了這些 jar

傑克遜數據類型-jdk 8-2.10.1 傑克遜數據類型-jsr310-2.10.1

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class BillingEvent {
    public Long Id;
    public LocalDate billingCreatedDate;
}

在我的屬性中,我有

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS=false

我得到的錯誤

com.fasterxml.jackson.databind.exc.InvalidDefinitionException:無法構造java.time.LocalDate實例(沒有創建者,如默認構造,存在):沒有從字符串值反序列化的字符串參數構造函數/工廠方法('2019-09 -02')

對我來說,將 setter 添加到您的BillingEvent就足夠了,例如:

public void setBillingCreatedDate(String str) {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");        
    billingCreatedDate = LocalDate.parse(str, formatter);
}

更多關於此處格式化的信息: String to LocalDate

基於評論:

是 JDK8 java.time 的 jackson 數據類型模塊嗎? 可能會幫助你,如果不是,它不是幫助,下面是一個工作實現的例子。 (沒有任何檢查左右):

public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

    private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

    @Override
    public LocalDate deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {        
          return LocalDate.parse(p.readValueAs(String.class), formatter);
    }

}

您也可以在其他地方使用它,就像在BillingEvent使用它BillingEvent

@JsonDeserialize(using = LocalDateDeserializer.class)
public LocalDate billingCreatedDate;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM