6

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

My domain model is the following:

  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 is something like this:

checkout:

{
  "cart": {
    "$oid": "51f631cb84812abb04000006"
  },

  "shippingAddress" : "5h avenue - new york",  
  "billingAddress" : "5h avenue - new york"
}

cart:

{
       "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 & json document, how in Spring I could create a checkout starting from a JSon?

My problem is that I don't know how to "explode" the $oid in the checkout & cart json in order to create checkout & cart Java Beans:

  • is there a way to do it automatically with Jackson?

  • or should I create a sort of Interceptor to handle a, for example, checkout json in order to retrieve the cart and then perform the mapping to the POJO?

(- or there is a 3rd way?)

Thanks a lot for any advice.

2 Answers 2

6

If I understood you correctly, you could do something like this (I'm using Spring 3.2.3.RELEASE & 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 Spring controller which 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 in your 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 as for me - it works :)

Sign up to request clarification or add additional context in comments.

Comments

0

It's enough to return data structure (model) in controller file. JSON will be generate automatically based on structure in your model. Take a look here for example: http://www.mkyong.com/spring-mvc/spring-3-mvc-and-json-example/ (section 3 - controller, and then, 5 - results)

1 Comment

Thank you, but in your example you convert from POJO to Json, where I.m trying to handle the opposite direction (put or post)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.