JAXB Custom Binding – Java.util.Date / Spring 3 Serialization

JaxB can handle Java.util.Date serialization, but it expects the following format: “yyyy-MM-ddTHH:mm:ss“. What if you need to format the date object in another format?

I had the same issue when I was working with Spring MVc 3 and Jackson JSON Processor, and recently, I faced the same issue working with Spring MVC 3 and JAXB for XML serialization.

Let’s digg into the issue:

Problem:

I have the following Java Beans which I want to serialize in XML using Spring MVC 3:

package com.loiane.model;

import java.util.Date;

public class Company {

 private int id;

 private String company;

 private double price;

 private double change;

 private double pctChange;

 private Date lastChange;

 //getters and setters

And I have another object which is going to wrap the POJO above:

package com.loiane.model;

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="companies")
public class Companies {

 @XmlElement(required = true)
 private List<Company> list;

 public void setList(List<Company> list) {
  this.list = list;
 }
}

In my Spring controller, I’m going to return a List of Company through the the @ResponseBody annotation – which is going to serialize the object automatically with JaxB:

@RequestMapping(value="/company/view.action")
public @ResponseBody Companies view() throws Exception {}

When I call the controller method, this is what it returns to the view:

<companies>
 <list>
  <change>0.02</change>
  <company>3m Co</company>
  <id>1</id>
  <lastChange>2011-09-01T00:00:00-03:00</lastChange>
  <pctChange>0.03</pctChange>
  <price>71.72</price>
 </list>
 <list>
  <change>0.42</change>
  <company>Alcoa Inc</company>
  <id>2</id>
  <lastChange>2011-09-01T00:00:00-03:00</lastChange>
  <pctChange>1.47</pctChange>
  <price>29.01</price>
 </list>
</companies>

Note the date format. It is not the format I expect it to return. I need to serialize the date in the following format: “MM-dd-yyyySolution:

I need to create a class extending the XmlAdapter and override the marshal and unmarshal methods and in these methods I am going to format the date as I need to:

package com.loiane.util;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class JaxbDateSerializer extends XmlAdapter<String, Date>{

 private SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");

    @Override
    public String marshal(Date date) throws Exception {
        return dateFormat.format(date);
    }

    @Override
    public Date unmarshal(String date) throws Exception {
        return dateFormat.parse(date);
    }
}

And in my Java Bean class, I simply need to add the @XmlJavaTypeAdapter annotation in the get method of the date property.

package com.loiane.model;

import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

import com.loiane.util.JaxbDateSerializer;

public class Company {

 private int id;

 private String company;

 private double price;

 private double change;

 private double pctChange;

 private Date lastChange;

 @XmlJavaTypeAdapter(JaxbDateSerializer.class)
 public Date getLastChange() {
  return lastChange;
 }
 //getters and setters
}

If we try to call the controller method again, it is going to return the following XML:

<companies>
 <list>
  <change>0.02</change>
  <company>3m Co</company>
  <id>1</id>
  <lastChange>09-01-2011</lastChange>
  <pctChange>0.03</pctChange>
  <price>71.72</price>
 </list>
 <list>
  <change>0.42</change>
  <company>Alcoa Inc</company>
  <id>2</id>
  <lastChange>09-01-2011</lastChange>
  <pctChange>1.47</pctChange>
  <price>29.01</price>
 </list>
</companies>

Problem solved!

Happy Coding! icon smile JAXB Custom Binding   Java.util.Date / Spring 3 Serialization

Reference: JAXB Custom Binding – Java.util.Date / Spring 3 Serialization from our JCG partner Loiane Groner at the Loiane Groner’s blog blog.

Do you want to know how to develop your skillset to become a Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

JPA Mini Book

Learn how to leverage the power of JPA in order to create robust and flexible Java applications. With this Mini Book, you will get introduced to JPA and smoothly transition to more advanced concepts.

JVM Troubleshooting Guide

The Java virtual machine is really the foundation of any Java EE platform. Learn how to master it with this advanced guide!

Given email address is already subscribed, thank you!
Oops. Something went wrong. Please try again later.
Please provide a valid email address.
Thank you, your sign-up request was successful! Please check your e-mail inbox.
Please complete the CAPTCHA.
Please fill in the required fields.

Leave a Reply


five × 9 =



Java Code Geeks and all content copyright © 2010-2014, Exelixis Media Ltd | Terms of Use | Privacy Policy
All trademarks and registered trademarks appearing on Java Code Geeks are the property of their respective owners.
Java is a trademark or registered trademark of Oracle Corporation in the United States and other countries.
Java Code Geeks is not connected to Oracle Corporation and is not sponsored by Oracle Corporation.
Do you want to know how to develop your skillset and become a ...
Java Rockstar?

Subscribe to our newsletter to start Rocking right now!

To get you started we give you two of our best selling eBooks for FREE!

Get ready to Rock!
You can download the complementary eBooks using the links below:
Close