2011-06-16 17 views
12

varsayılan biçimini değiştirmek için bir yol var mı JAXB serialize/serisi kaldırılmaya tipleri, burada http://jaxb.java.net/guide/Using_different_datatypes.htmlProgramlı olarak varsayılan JAXB tarih serileştirmesi nasıl değiştirilir?

Temelde yapmak istiyorum belirtildiği gibi bağlayıcı ve/veya xml JAXB yoluyla açıklama aracılığıyla belirtmeden benim durumumda tarihleri, gibi bir şey:

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

özelleştirilmiş bir şekilde/serisi kaldırılmaya tarihleri ​​serialize önceden yapılandırılmış JaxBContext veya Marshaller/unmarshaller sahip olmak ..

Ek açıklamalar veya Statica aracılığıyla bekliyoruz bunu nasıl yapacağınızı gösteren herhangi kaynağı bulunamadı xml ciltleme dosyası ile .. Teşekkürler!

+0

javax.xml.bind.Marshaller.setAdapter (XmlAdapter) 'sizin için çalışmıyor mu? – lexicore

+0

Hayır yoktu .. :( – zhk

+1

@lexicore - 'modeli zaten 'XmlAdapter' kullanmak üzere yapılandırıldığında javax.xml.bind.Marshaller.setAdapter (XMLAdapter)' başlatılan bir' XmlAdapter' geçen içindir ve bir 'XmlAdapter' tanıtmak için değil.Bir örnek için bkz: http://stackoverflow.com/questions/5319024/using-jaxb-to-cross-reference-xmlids-from-two-xml-files/5327425#5327425 –

cevap

7

bu deneyin:

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); 
    } 
} 

Bu üretir:

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

Bu benim aradığım şey değil, Event nesnesinin önceden tarihlendirmeyi (@XmlJavaTypeAdapter) nasıl dizileceğini belirten bir ek açıklama var: İhtiyacım olan şey önceden yapılandırılmış bir jaxb (un)) Önceden ihtiyaç duymadan bazı tiplerin nasıl seri hale getirileceğini (de) bilen mareşal nesneye iletilen nesnelere dikkat edin .. – zhk

+5

SimpleDateFormat "dd_mm_yyyy" ifadesinin günleri, MINUTES ve yılları göstereceğini unutmayın. Muhtemelen "dd_MM_yyyy" daha iyi bir seçimdir. – slartidan

+0

Mareşalin onaylanması mümkün mü? – Aguid

13

Bu sizin için tam olarak aradığınızı değil ama tek tek her Tarih alanını annotating yener. Paketinize bir XmlJavaTypeAdapter kurabilirsiniz, böylece paketinizdeki Tarih'e yapılan her başvuru onu kullanır. Nesnelerinizin com.example paketinde iseniz, aşağıdaki içeriğe sahip buna bir package-info.java dosyası eklemek gerekir:

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

+1 - İlgili bir örnek için bkz: http://bdoughan.blogspot.com/2011/05/jaxb-and-joda-time-dates-and-times.html –

+2

Bu, aynı zamanda com. Örneğin, com.example.foo ve com.example.bar? –

+0

Bu programsal olarak değil: çerçeveler için çalışmıyor :( –

0

bütün JAXB belgeleri ve birçok dersler arama yaptıktan sonra, ben herhangi bir cevap bulamadık Bu, XMLAdapter'deki sabit kodun dışında kalan tarihleri ​​yapılandırabilir. DATEFORMAT = aa-gg-YYYY

Şimdi XMLAdapter uygulama olarak aşağıda gider:

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); 
    } 

} 

Şimdi @XmlJavaTypeAdapter kullanabilirsiniz (ConfigurableAdapterForDate Ben örneğin tarih biçimlerini sahip sınıf yolunda bir özellik dosyasını koymak .class) serialize/deserialize etmek istediğiniz tarih nesneleri için. Bir özellik dosyasını yüklemek için yayı kullanmak ücretsizdir. Yukarıdaki kod, tarihinizi buna göre yapılandırır.

+0

Özniteliğin doğrulanması, aşağıdaki gibi bir dize olarak bildirildiğinden başarısız olacak [ \t \t \t \t \t ihracat tarih \t \t \t \t \t \t \t \t \t \t \t]. – Aguid

İlgili konular