【问题标题】:Can not instantiate value of type [simple type, class java.time.LocalDate] from String value无法从字符串值实例化类型 [简单类型,类 java.time.LocalDate] 的值
【发布时间】:2016-08-25 11:39:27
【问题描述】:

我有这样的课:

@Data
@NoArgsConstructor(force = true)
@AllArgsConstructor(staticName = "of")
public class BusinessPeriodDTO {
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    LocalDate startDate;
    @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
    LocalDate endDate;
}

我在另一个类中使用了这个类,我们称之为PurchaseOrder

@Entity
@Data
@NoArgsConstructor(access = AccessLevel.PROTECTED, force = true)
public class PurchaseOrder {
    @EmbeddedId
    PurchaseOrderID id;

    @Embedded
    BusinessPeriod rentalPeriod;

    public static PurchaseOrder of(PurchaseOrderID id, BusinessPeriod period) {
        PurchaseOrder po = new PurchaseOrder();
        po.id = id;

        po.rentalPeriod = period;

        return po;
    }

我正在尝试使用 jakson 和这个 JSON 填充 purchaseOrder 记录:

 {
     "_class": "com.rentit.sales.domain.model.PurchaseOrder",
     "id": 1,
     "rentalPeriod": {
         "startDate": "2016-10-10",
         "endDate": "2016-12-12"
     }
 }

但我遇到了一个错误:

java.lang.RuntimeException: com.fasterxml.jackson.databind.JsonMappingException: 无法从字符串值 ('2016-10-10') 实例化类型 [简单类型,类 java.time.LocalDate] 的值;

我确信 jakson 和普及工作正常。

【问题讨论】:

标签: java spring


【解决方案1】:

包含在你的 pom.xml 中:

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.9.6</version>
</dependency>

然后在你的BusinessPeriodDTO.java 中导入LocalDateDeserializer 如下:

import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;

最后,总是在你的BusinessPeriodDTO.java 文件中,像这样注释感兴趣的日期:

@JsonDeserialize(using = LocalDateDeserializer.class)
LocalDate startDate;
@JsonDeserialize(using = LocalDateDeserializer.class)
LocalDate endDate;

【讨论】:

    【解决方案2】:

    老问题,但我最近不得不自己回答。 有不同的解决方案(如 rapasoft 所评论,参见例如here)。 我使用的快速解决方案包括添加一个setDate(String) 反序列化方法。 它可能不是最漂亮的解决方案,但它可以在不更新其他类的情况下工作。 下面一个可运行的类来演示:

    import java.time.LocalDate;
    import java.time.format.DateTimeFormatter;
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    import com.fasterxml.jackson.annotation.JsonFormat.Shape;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
    
    /**
     * Demonstrate Java 8 date/time (de)serialization for JSON with Jackson databind.
     * Requires {@code com.fasterxml.jackson.core:jackson-databind:2.8.5} 
     * and {@code com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.5} 
     */
    public class JdateDto {
    
        /** The pattern as specified by {@link java.text.SimpleDateFormat} */
        public static final String ISO_LOCAL_DATE_PATTERN = "yyyy-MM-dd";
    
        /* Used when serializing isoLocalDate. */
        @JsonFormat(shape = Shape.STRING, pattern = ISO_LOCAL_DATE_PATTERN)
        private LocalDate isoLocalDate;
    
        public LocalDate getIsoLocalDate() {
            return isoLocalDate;
        }
    
        /* Used when deserializing isoLocalDate. */
        public void setIsoLocalDate(String date) {
            setIsoLocalDate(LocalDate.parse(date, DateTimeFormatter.ISO_LOCAL_DATE));
        }
    
        public void setIsoLocalDate(LocalDate isoDate) {
            this.isoLocalDate = isoDate;
        }
    
        public static void main(String[] args) {
    
            try {
                ObjectMapper mapper = new ObjectMapper();
                mapper.registerModule(new JavaTimeModule());
                JdateDto dto = new JdateDto();
                dto.setIsoLocalDate(LocalDate.now());
                String json = mapper.writeValueAsString(dto);
                System.out.println(json);
                JdateDto dto2 = mapper.readValue(json, JdateDto.class);
                if (dto.getIsoLocalDate().equals(dto2.getIsoLocalDate())) {
                    System.out.println("Dates match.");
                } else {
                    System.out.println("Dates do not match!");
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-01
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2019-11-24
      相关资源
      最近更新 更多