Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JSON Serializing date in a custom format (Can not construct instance of java.util.Date from String value)

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"))

passing json request to REST controller method in a POJO class.user should enter only in below datetime format other wise it should throw message.why DateSerializer is not calling?

add(@Valid @RequestBody User user)
{
}

json:

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

pojo class variable

@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));
}
like image 238
user739115 Avatar asked Jul 15 '13 13:07

user739115


3 Answers

Annotate your created_date field with the JsonFormat annotation to specify the output format.

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = TimeZone.getDefault(), locale = Locale.getDefault())

Note that you may need to pass in a different Locale and TimeZone if they should be based on something other than what the server uses.

You can find out more information in the docs.

like image 83
Splaktar Avatar answered Nov 18 '22 07:11

Splaktar


I have the same problem, so I write a custom date deserialization with @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);
    }
}
like image 43
lbdfcgyjjr Avatar answered Nov 18 '22 05:11

lbdfcgyjjr


For someone ,If you are using DTO/VO/POJO to map your request you can simply annotate your date field

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date customerRegDate;

And json request should be:

{
"someDate":"2020-04-04 16:11:02"
}

You don't need to annotate Entity class variable.

like image 2
Vikash Kumar Avatar answered Nov 18 '22 05:11

Vikash Kumar