Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

REST with Spring and Jackson full data binding

I'm using Spring MVC to handle JSON POST requests. Underneath the covers I'm using the MappingJacksonHttpMessageConverter built on the Jackson JSON processor and enabled when you use the mvc:annotation-driven.

One of my services receives a list of actions:

@RequestMapping(value="/executeActions", method=RequestMethod.POST)     public @ResponseBody String executeActions(@RequestBody List<ActionImpl> actions) {         logger.info("executeActions");         return "ACK";     } 

I have found that Jackson maps the requestBody to a List of java.util.LinkedHashMap items (simple data binding). Instead, I would like the request to be bound to a List of typed objects (in this case "ActionImpl").

I know this is easy to do if you use Jackson's ObjectMapper directly:

List<ActionImpl> result = mapper.readValue(src, new TypeReference<List<ActionImpl>>() { });  

but I was wondering what's the best way to achieve this when using Spring MVC and MappingJacksonHttpMessageConverter. Any hints?

Thanks

like image 603
Javier Ferrero Avatar asked Dec 14 '10 16:12

Javier Ferrero


People also ask

Does spring REST use Jackson?

Spring Framework and Spring Boot provide builtin support for Jackson based XML serialization/deserialization. As soon as you include the jackson-dataformat-xml dependency to your project, it is automatically used instead of JAXB2.

Does spring boot have Jackson ObjectMapper?

Overview. When using JSON format, Spring Boot will use an ObjectMapper instance to serialize responses and deserialize requests. In this tutorial, we'll take a look at the most common ways to configure the serialization and deserialization options. To learn more about Jackson, be sure to check out our Jackson tutorial.

What is simple data binding in Jackson data binding?

Advertisements. Data Binding API is used to convert JSON to and from POJO (Plain Old Java Object) using property accessor or using annotations. It is of two type. Simple Data Binding - Converts JSON to and from Java Maps, Lists, Strings, Numbers, Booleans and null objects.


1 Answers

I have found that you can also work around the type erasure issue by using an array as the @RequestBody instead of a collection. For example, the following would work:

public @ResponseBody String executeActions(@RequestBody ActionImpl[] actions) { //... } 
like image 80
Michiel Verkaik Avatar answered Oct 04 '22 12:10

Michiel Verkaik