Skip to content
Advertisement

Spring deserializes a LocalDate in a @RequestBody differently from one in a @RequestParam – why, and can they be the same?

QUESTION: Spring appears to use different deserialization methods for LocalDate depending on whether it appears in a @RequestBody or a request @ReqestParam – is this correct, and if so, is there a way to configure them to be the same throughout an application?

BACKGROUND: In my @RestController, I have two methods – one GET, and one POST. The GET expects a request parameter (“date”) that is of type LocalDate; the POST expects a JSON object in which one key (“date”) is of type LocalDate. Their signatures are similar to the following:

JavaScript

I’ve configured my ObjectMapper as follows:

JavaScript

Which ensures the system accepts LocalDate in the format yyyy-MM-dd and deserializes it as expected – at least when it is part of a @RequestBody. Thus if the following is the request body for the POST

JavaScript

The system deserializes the request body into an EntityPost as expected.

However, that configuration does not apply to the deserialization of the @RequestParam. As a result, this fails:

JavaScript

Instead, the system appears to expect the format MM/dd/yy. As a result, this succeeds:

JavaScript

I know I can change this on a parameter-by-parameter basis using the @DateTimeFormat annotation. I know that if I change the signature of the GET method as follows, it will accept the first format:

JavaScript

However, I would prefer if I didn’t have to include an annotation for every usage of LocalDate. Is there any way to set this globally, so that the system deserializes every @RequestParam of type LocalDate in the same way?

For reference:

I’m using Spring 4.3.2.RELEASE

I’m using Jackson 2.6.5

Advertisement

Answer

Per @Andreas in comments, the Spring Framework uses Jackson to deserialize @RequestBody but Spring itself deserializes @RequestParam. This is the source of the difference between the two.

This answer shows how to use @ControllerAdvice and @InitBinder to customize the deserialization of @RequestParam. The code I ultimately used follows:

JavaScript
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement