How to handle POJO-attached objects when working with JSon in Spring MVC Rest

I'm trying to figure out how to better understand serialization / deserialization of JSon nested Java objects in Spring MVC.

My domain model is as follows:

public class Cart { private String id; private Customer customerID; private Checkout checkoutID; private List<CartProduct> itemCatalogList; *** ... getters & setters ... *** } public class ProductCart { private String sku; private String color; private String sizeBase private int qty; *** ... getters & setters ... *** } public class Checkout { private String id; private String billingAddress; private String shippingAddress; private Cart cartID; *** ... getters & setters ... *** } 

The JSon I was thinking about looks something like this:

Photo:

 { "cart": { "$oid": "51f631cb84812abb04000006" }, "shippingAddress" : "5h avenue - new york", "billingAddress" : "5h avenue - new york" } 

basket

 { "customer": { "$oid": "5174da574940368a9126e8dc" }, "items_catalog": [ { "sku": "00075161", "color": "ff99cc", "size_base": "IT_25", "qty": 3, }, { "sku": "00075161", "color": "ff99cc", "size_base": "IT_27", "qty": 2, }, { "sku": "00075161", "color": "ff99cc", "size_base": "IT_29", "qty": 1, } } 

Assuming this is a viable domain model and a json document, how in Spring could I create validation starting with JSon?

My problem is that I don’t know how to "explode" $ oid in the json checkout and basket to create a Java Beans check and basket:

  • Is there a way to do this automatically with Jackson?

  • or do I need to create some kind of interceptor for processing, for example, checkout json, in order to get the basket, and then perform a mapping to POJO?

(- or is there a third way?)

Thanks so much for any advice.

+3
source share
2 answers

If I understood you correctly, you could do something like this (I use Spring 3.2.3.RELEASE and Jackson 1.9.12).

In your applicationContext.xml you have:

 <bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="jacksonMessageConverter"/> </list> </property> </bean> 

You have a Spring controller that looks like this:

 package test; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @Controller @RequestMapping("/json") public class JsonParsingController { private final static Logger log = Logger.getLogger(JsonParsingController.class); @RequestMapping(value = "/cart.do", method = RequestMethod.POST, produces = "application/json; charset=utf-8") @ResponseBody public CartResponse handleCart(@RequestBody Cart cart) { if (cart != null) { log.debug(cart); } return new CartResponse("OK!"); } } 

and three POJOs:

 package test; public class Cart { private String id; private Checkout checkoutID; public String getId() { return id; } public void setId(String id) { this.id = id; } public Checkout getCheckoutID() { return checkoutID; } public void setCheckoutID(Checkout checkoutID) { this.checkoutID = checkoutID; } @Override public String toString() { return "Cart{" + "id='" + id + '\'' + ", checkoutID=" + checkoutID + '}'; } } package test; public class Checkout { private String id; private String billingAddress; private String shippingAddress; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getBillingAddress() { return billingAddress; } public void setBillingAddress(String billingAddress) { this.billingAddress = billingAddress; } public String getShippingAddress() { return shippingAddress; } public void setShippingAddress(String shippingAddress) { this.shippingAddress = shippingAddress; } @Override public String toString() { return "Checkout{" + "id='" + id + '\'' + ", billingAddress='" + billingAddress + '\'' + ", shippingAddress='" + shippingAddress + '\'' + '}'; } } package test; public class CartResponse { private String result; public CartResponse(String result) { this.result = result; } public String getResult() { return result; } public void setResult(String result) { this.result = result; } } 

Then on the HTML page, you can do something like this:

 <script language="JavaScript" type="text/javascript"> $(document).ready(function () { // Your data var arr = { id: '51f631cb84812abb04000006', checkoutID: { id: '123456789', "shippingAddress" : "5h avenue - new york", "billingAddress" : "5h avenue - new york" } }; $.ajax({ url: '/json/cart.do', type: 'POST', data: JSON.stringify(arr), contentType: 'application/json; charset=utf-8', dataType: 'json', async: false, success: function (msg) { alert(msg.result); } }); }); </script> 

At least for me - it works :)

+4
source

This is enough to return the data structure (model) to the controller file. JSON will be automatically generated based on the structure in your model. Look here, for example: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/ (section 3 - controller, and then 5 - results)

0
source

All Articles