2025-05-23

在spring mvc3中JACKSON序列化日期格式的問題(http://jackyrong.iteye.com/admin/blogs/1089909)一文中,提到瞭相關的日期問題。同樣地,如果在JAXB中,REST形式返回的話,也有這樣的問題,繼續看例子:


1)POJO類:
   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


2)現在要返回company的集合,而且要用JAXB包裝
   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;
    }
}
而在SPRING CONTROLLER中,要返回如下的:
  @RequestMapping(value=”/company/view.action”)
public @ResponseBody Companies view() throws Exception {}


這時,返回的XML為如下:
<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>
可以看到,時間格式不是很好使,於是我們自定義進行格式化一下:
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);
    }
}


這裡繼承瞭XmlAdapter,並且進行瞭marshal和unmarshal,就是字符串日期和日期轉字符,使用時,註意加上 @XmlJavaTypeAdapter 標簽,如下
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
}
結果就正確輸出瞭;
<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>

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *