杰克逊的InvalidDefinitionException

时间:2019-12-20 01:57:43

标签: java spring-boot jackson deserialization localdate

在spring boot 2.2.2中,java 11通过ibm mq接收对象。

收到的对象具有LocalDate数据类型。

项目在Maven中具有spring-boot-starter-web starter。

我在项目中看到这些罐子

jackson数据类型-jdk 8-2.10.1   jackson-datatype-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')

1 个答案:

答案 0 :(得分:0)

对我来说,将setter添加到您的BillingEvent中就足够了,例如:

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

有关格式化的更多信息:String to LocalDate

基于评论:

Is there a jackson datatype module for JDK8 java.time?可能会为您提供帮助,如果没有帮助,则可以在下面的工作展示示例中找到帮助。 (无任何检查):

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中使用它一样:

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