2011-06-16 72 views
12

有沒有辦法來改變默認方式JAXB序列化/反序列化類型,日期,於我而言,沒有具體說明,通過標註和/或通過XML JAXB綁定這裏提到 http://jaxb.java.net/guide/Using_different_datatypes.html如何以編程方式更改默認的JAXB日期序列化?

我基本上喜歡做的事是這樣的:

JAXBContext jaxbContext = ...; 
    Marshaller marshaller = jaxbContext.createMarshaller().setAdapter(new DateAdapter(dateFormat)); 

若要進行序列化的自定義的方式/反序列化日期的預配置的JAXBContext或的Marshaller/Unmarshaller的..

找不到,顯示如何做到通過註釋或statica指望任何資源lly用xml綁定文件.. 謝謝!

+0

'javax.xml.bind.Marshaller.setAdapter(XmlAdapter)'不適合你嗎? – lexicore 2011-06-17 06:34:58

+0

不,它不是.. :( – zhk 2011-06-19 10:39:33

+1

@lexicore - 'javax.xml.bind.Marshaller.setAdapter(XmlAdapter)'用於在模型已經配置爲使用'XmlAdapter'時傳入已初始化的'XmlAdapter',並且不要引入'XmlAdapter'。例如,請參閱:http://stackoverflow.com/questions/5319024/using-jaxb-to-cross-reference-xmlids-from-two-xml-files/5327425#5327425 – 2011-06-28 16:02:09

回答

7

試試這個:

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement(name = "event") 
public class Event { 

    private Date date; 
    private String description; 

    @XmlJavaTypeAdapter(DateFormatterAdapter.class) 
    public Date getDate() { 
     return date; 
    } 

    public void setDate(final Date date) { 
     this.date = date; 
    } 

    public String getDescription() { 
     return description; 
    } 

    public void setDescription(final String description) { 
     this.description = description; 
    } 

    private static class DateFormatterAdapter extends XmlAdapter<String, Date> { 
     private final SimpleDateFormat dateFormat = new SimpleDateFormat("dd_mm_yyyy"); 

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

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

    public static void main(final String[] args) throws Exception { 
     final JAXBContext context = JAXBContext.newInstance(Event.class); 
     final Marshaller marshaller = context.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     final Event event = new Event(); 
     event.setDate(new Date()); 
     event.setDescription("im rick james"); 

     marshaller.marshal(event, System.out); 
    } 
} 

這將產生:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<event> 
    <date>16_05_2011</date> 
    <description>im rick james</description> 
</event> 
+2

這不是我要找的,你的Event對象已經有一個註解,指定如何序列化日期(@XmlJavaTypeAdapter)。我需要的是預先配置的jaxb(un )編組人員已經知道如何(去)序列化某些類型而不需要預先安排注意傳遞給它的對象.. – zhk 2011-06-16 21:51:35

+5

請注意,SimpleDateFormat「dd_mm_yyyy」將顯示天,分鐘和年。可能「dd_MM_yyyy」是更好的選擇。 – slartidan 2013-12-12 17:25:17

+0

是否有可能通過驗證來執行元帥? – Aguid 2017-10-10 13:12:05

13

這不是你在尋找什麼,但它打敗分別標註每個日期字段。您可以在包級別設置XmlJavaTypeAdapter,以便包中的每個Date對象都將使用它。如果你的對象是在com。示例包,你應該在package-info.java文件添加到它具有以下內容:

@XmlJavaTypeAdapter(value=MyCustomDateAdapter.class,type=Date.class) 
package com.example; 
+0

+1 - 有關相關示例,請參閱:http://bdoughan.blogspot.com/2011/05/jaxb-and-joda-time-dates-and-times.html – 2011-06-28 15:58:56

+2

這也會處理com的子包。例如com.example.foo和com.example.bar? – 2014-06-13 09:43:52

+0

這不是編程式的:它不適用於框架:( – 2016-06-22 13:12:29

0

搜索整個JAXB的文檔和許多教程後,我沒有找到任何答案它可以配置與XMLAdapter中的硬編碼不同的日期。 我把屬性文件在類路徑中的日期格式,例如: DATEFORMAT = MM-DD-YYYY

現在你XMLAdapter實現雲如下:

import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class ConfigurableAdapterForDate extends XmlAdapter<String, Date>{ 

    private static final String FORMAT = "yyyy-mm-dd"; 
    private String formatFromFile = null; 
    private SimpleDateFormat format = new SimpleDateFormat(); 

    private void setFormatFromFile() throws IOException { 
     //load property file 
     Properties prop = new Properties(); 
     InputStream is = this.getClass().getResourceAsStream("<path to your property file>"); 
     prop.load(is); 

     //get the format from loaded property file 
     formatFromFile = prop.getPropertyValue("dateFormat"); 

     if(formatFromFile != null) { 
      format.applyPattern(formatFromFile); 
     } 
     else { 
      format.applyPattern(FORMAT); 
     } 
    } 

    @Override 
    public Date unmarshal(String v) throws Exception { 
     this.setFormatFromFile(); 
     return format.parse(v); 
    } 

    @Override 
    public String marshal(Date v) throws Exception { 
     this.setFormatFromFile(); 
     return format.format(v); 
    } 

} 

現在你可以使用@XmlJavaTypeAdapter(ConfigurableAdapterForDate .class)用於您想要序列化/反序列化的日期對象。 一個免費使用彈簧也可以加載屬性文件。以上代碼將相應地配置您的日期。

+0

屬性的驗證將失敗,因爲它被聲明爲String,如下[[xs:attribute name =「date」類型= 「XS:日期」 使用= 「需要」> \t \t \t \t \t \t \t \t \t 出口的日期 \t \t \t \t \t \t \t]。 – Aguid 2017-10-10 13:22:35

相關問題