2013-07-15 30 views
16
could not read JSON: Can not construct instance of java.util.Date from String 
value '2012-07-21 12:11:12': not a valid representation("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd")) 

chuyển yêu cầu json tới phương thức bộ điều khiển REST trong POJO class.user chỉ nên nhập vào dưới định dạng ngày giờ khác nó nên ném tin nhắn. Tại sao DateSerializer không gọi?Ngày nối tiếp JSON theo định dạng tùy chỉnh (Không thể tạo ví dụ của java.util.Date từ giá trị Chuỗi)

add(@Valid @RequestBody User user) 
{ 
} 

json:

{ 
    "name":"ssss", 
    "created_date": "2012-07-21 12:11:12" 
} 

POJO lớp biến

@JsonSerialize(using=DateSerializer.class) 
@Column 
@NotNull(message="Please enter a date")  
@Temporal(value=TemporalType.TIMESTAMP) 
private Date created_date; 

public void serialize(Date value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
    logger.info("serialize:"+value); 
    DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    logger.info("DateSerializer formatter:"+formatter.format(value)); 
    jgen.writeString(formatter.format(value)); 
} 

Trả lời

6

Tôi có cùng một vấn đề, vì vậy tôi viết một ngày tuỳ chỉnh deserialization với @JsonDeserialize(using=CustomerDateAndTimeDeserialize.class)

public class CustomerDateAndTimeDeserialize extends JsonDeserializer<Date> { 

    private SimpleDateFormat dateFormat = new SimpleDateFormat(
      "yyyy-MM-dd HH:mm:ss"); 

    @Override 
    public Date deserialize(JsonParser paramJsonParser, 
      DeserializationContext paramDeserializationContext) 
      throws IOException, JsonProcessingException { 
     String str = paramJsonParser.getText().trim(); 
     try { 
      return dateFormat.parse(str); 
     } catch (ParseException e) { 
      // Handle exception here 
     } 
     return paramDeserializationContext.parseDate(str); 
    } 
} 
+0

Bạn đang triển khai lớp CustomerDateAndTimeDeserialize này như thế nào? –

0
  1. Nếu bạn muốn để ràng buộc một chuỗi JSON cho đến nay, quá trình này được gọi là "deserialization", không phải tuần tự.
  2. Để liên kết chuỗi JSON cho đến nay, hãy tạo một ngày tùy chỉnh deserialization, chú thích "created_date" hoặc setter của nó với @JsonDeserialize (sử dụng = YourCustomDateDeserializer.class) nơi bạn phải triển khai phương thức "public Date deserialize (...) "để cho Jackson biết cách chuyển đổi chuỗi thành một ngày.

Tận hưởng.

32

Chú thích lĩnh vực CREATED_DATE của bạn với các chú thích JsonFormat để xác định định dạng đầu ra.

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") 
+2

Có phải tất cả những gì bạn phải làm? Tôi đã thử điều này và nó đã không làm việc của chính nó. Có thể một số chú thích khác được yêu cầu ở đâu đó? – Dariusz

+1

Bạn cần sử dụng Jackson: http://fasterxml.github.io/jackson-annotations/javadoc/2.0.0/com/fasterxml/jackson/annotation/JsonFormat.html – Splaktar

+1

Hãy lưu ý đến việc sử dụng chú thích này. Đây được biết là ** [vấn đề] (http://stackoverflow.com/q/31822877/2650174) ** với ít hơn một ngày. –

0

Tuy nhiên, một cách khác là có đối tượng Ngày tùy chỉnh tự quản lý tuần tự của riêng nó.

Mặc dù tôi không thực sự nghĩ rằng việc mở rộng các đối tượng đơn giản như Date, Long, v.v ... là một thực tế tốt, trong trường hợp này nó làm cho mã dễ đọc, có một điểm mà định dạng được xác định và ít tương thích với đối tượng bình thường Date.

public class CustomFormatDate extends Date { 

    private DateFormat myDateFormat = ...; // your date format 

    public CustomFormatDate() { 
     super(); 
    } 

    public CustomFormatDate(long date) { 
     super(date); 
    } 

    public CustomFormatDate(Date date) { 
     super(date.getTime()); 
    } 


    @JsonCreator 
    public static CustomFormatDate forValue(String value) { 
     try { 
      return new CustomFormatDate(myDateFormat.parse(value)); 
     } catch (ParseException e) { 
      return null; 
     } 
    } 

    @JsonValue 
    public String toValue() { 
     return myDateFormat.format(this); 
    } 

    @Override 
    public String toString() { 
     return toValue(); 
    } 
} 
Các vấn đề liên quan