2016-04-30 4 views
0

String値からタイプ[単純型、クラスjava.time.LocalDate]の値をインスタンス化できません:が、私はこのようなクラス持っ

@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使用purchaseOrderのレコードを移入しようとしていると、このJSON:

{ 
    "_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: Can not instantiate value of type [simple type, class java.time.LocalDate] from String value ('2016-10-10');

私はjaksonと普及が正常に動作することを確認しています。

+0

@peeskillet ... –

+0

おそらく、この答えがお手伝いします。http://stackoverflow.com/questions/28802544/java-8-localdate-jackson-format – rapasoft

答えて

1

古い質問がありましたが、最近は自分で答えなければなりませんでした。 さまざまな解決策があります(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(); 
     } 
    } 
} 
関連する問題