Bootstrap

xml日期转换遇到的坑

  JAXB是个好东西,转换JAVA OBJECT到XML的,最近发现JAXB中对java.util.Date的转换有些要注意的地方,笔记之。 


比如有一个POJO如下: 
  
Java代码   收藏代码
  1. import java.util.Date;  
  2.   
  3. public class Company {  
  4.   
  5.  private int id;  
  6.   
  7.  private String company;  
  8.   
  9.  private double price;  


  另外一个POJO,其中持有的是list类型的Company,如下: 
Java代码   收藏代码
  1. package com.loiane.model;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.xml.bind.annotation.XmlElement;  
  6. import javax.xml.bind.annotation.XmlRootElement;  
  7.   
  8. @XmlRootElement(name="companies")  
  9. public class Companies {  
  10.   
  11.  @XmlElement(required = true)  
  12.  private List<Company> list;  
  13.   
  14.  public void setList(List<Company> list) {  
  15.   this.list = list;  
  16.  }  
  17. }  

   
  这样通过spring mvc出来的XML会发现: 


Java代码   收藏代码
  1. @RequestMapping(value="/company/view.action")  
  2.   
  3. public @ResponseBody Companies view() throws Exception {}  


 
Java代码   收藏代码
  1. <companies>  
  2.  <list>  
  3.   <change>0.02</change>  
  4.   <company>3m Co</company>  
  5.   <id>1</id>  
  6.   <lastChange>2011-09-01T00:00:00-03:00</lastChange>  
  7.   。。  
  8.  </list>  
  9.  。。。。。。。  
  10. </companies>  


  时间格式不对头,查阅了下,发现要继承XmlAdapter,重写其中的方法去对日期进行格式化, 
 
Java代码   收藏代码
  1. import java.text.SimpleDateFormat;  
  2. import java.util.Date;  
  3.   
  4. import javax.xml.bind.annotation.adapters.XmlAdapter;  
  5.   
  6. public class JaxbDateSerializer extends XmlAdapter<String, Date>{  
  7.   
  8.  private SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");  
  9.   
  10.     @Override  
  11.     public String marshal(Date date) throws Exception {  
  12.         return dateFormat.format(date);  
  13.     }  
  14.   
  15.     @Override  
  16.     public Date unmarshal(String date) throws Exception {  
  17.         return dateFormat.parse(date);  
  18.     }  
  19. }  


然后在需要对日期处理的属性中,加入 
  @XmlJavaTypeAdapter ,即: 

Java代码   收藏代码
  1. package com.loiane.model;  
  2.   
  3. import java.util.Date;  
  4.   
  5. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;  
  6.   
  7. import com.loiane.util.JaxbDateSerializer;  
  8.   
  9. public class Company {  
  10.   
  11.  private int id;  
  12.   
  13.  private String company;  
  14.   
  15.    
  16.  @XmlJavaTypeAdapter(JaxbDateSerializer.class)  
  17.  public Date getLastChange() {  
  18.   return lastChange;  
  19.  }  
  20.   
  21. }  


  就可以生成合乎规格的信息咯,如下 
Java代码   收藏代码
  1. <companies>  
  2.  <list>  
  3.   <change>0.02</change>  
  4.   <company>3m Co</company>  
  5.   <id>1</id>  
  6.   <lastChange>09-01-2011</lastChange>  
  7.     
  8.  </list>  
  9. 。。。。。。。。。  
  10. </companies> 
;