user3745727
user3745727

Reputation: 115

Unable to convert String to Date by requestBody in spring

I have the below Code :

DTO :

 Class MyDTO {
        import java.util.Date;
        private Date dateOfBirth;

        public Date getDateOfBirth() {
                return dateOfBirth;
            }
        public void setDateOfBirth(Date dateOfBirth) {
                this.dateOfBirth = dateOfBirth;
            }

    }

Controller

public void saveDOB(@RequestBody MyDTO myDTO, HttpServletRequest httprequest, HttpServletResponse httpResponse) {
       System.out.println("Inside Controller");
       System.out.println(myDTO.getDateOfBirth()); 
}

JSON Request :

{
"dateOfBirth":"2014-09-04",

}

If I send the request as yyyy-mm-dd automatic conversion to date object happens. output in controller:- dateOfBirth= Thu Sep 04 05:30:00 IST 2014

But when I send DateofBirth in dd-mm-yyyy format It does not convert String to Date automatically.So how i can i handle this case.

JSON Request :

{
"dateOfBirth":"04-09-2014",

}

Output: No Output in console does not even reaches controller.

I have tried with @DateTimeFormat but its not working.

I am using Spring 4.02 Please suggest is there any annotation we can use.

Upvotes: 8

Views: 31976

Answers (2)

Jaille Chen
Jaille Chen

Reputation: 21

List itemCreate a class to extend JsonDeserializer

public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {
    @Override
    public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
        String date = jsonParser.getText();
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }
}

Use @JsonDeserialize(using = CustomJsonDateDeserializer.class) annotation on setter methods.

Thanks @Varun Achar answer, url

Upvotes: 2

Sotirios Delimanolis
Sotirios Delimanolis

Reputation: 279880

@DateTimeFormat is for form backing (command) objects. Your JSON is processed (by default) by Jackson's ObjectMapper in Spring's MappingJackson2HttpMessageConverter (assuming the latest version of Jackson). This ObjectMapper has a number of default date formats it can handle. It seems yyyy-mm-dd is one of them, but dd-mm-yyyy is not.

You'll need to register your own date format with a ObjectMapper and register that ObjectMapper with the MappingJackson2HttpMessageConverter. Here are various ways to do that :

Alternatively, you can use a JsonDeserializer on either your whole class or one of its fields (the date). Examples in the link below

Upvotes: 14

Related Questions