2011-01-12 10 views
4

xmlからJAXBのJavaクラスにアンマーシャリングするときに、 "javax.xml.datatype.XMLGregorianCalendar"を "java.util.Date"に変更したいとします。JAXBでは、@ XmlJavaTypeAdaptersアノテーションの使い方は?

しかし、@ XmlJavaTypeAdapterの注釈はJavaクラスには入れません。

だから、私にそれを使用するための例を示し

ください...私は@XmlJavaTypeAdaptersのアノテーションを使用しようとするつもりですが、私はそれを使用する方法がわかりません。面白いよう

+1

スキーマから生成されたコード、または手書きのJAXBバインディングを使用していますか? – skaffman

+0

返事ありがとう、skaffman。私はそれを手書きで作成し、スキーマはAntタスクを使用するためのアノテーションなしでJavaBeansから作成されます。 – Take

答えて

8

JAXBがネイティブjava.util.Dateをサポートしているのでさておき、あなたが実際に、日付にたXMLGregorianCalendarを適応させる必要はありません - このように:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class Example { 
    @XmlSchemaType(name = "date") 
    public Date publishingDate; 
} 

あなたがそれを必要とする場合は、@XmlJavaTypeAdapterができますカスタムクラスと仮定すると、次のように動作します:

public class SillyDate { 
    public SillyDate(int year, int month, int day) { 
     super(); 
     this.year = year; 
     this.month = month; 
     this.day = day; 
    } 

    public String toString() { 
     return "SillyDate [year=" + year + ", month=" + month + ", day=" + day + "]"; 
    } 

    public int year; 
    public int month; 
    public int day; 
} 

あなたはJAXBを理解し、このようにそのクラスとカスタムクラスの間にアダプタを書くことができますクラスが必要

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class Example2 { 
    @XmlSchemaType(name = "date") 
    @XmlJavaTypeAdapter(type=XMLGregorianCalendar.class,value =SillyDateAdapter.class) 
    public SillyDate publishingDate; 
} 

this onethis oneのように、ネット上で利用できる@XmlJavaTypeAdapterを使用しての良い例、およびいくつかの他の多くがあります。

public class SillyDateAdapter extends XmlAdapter<XMLGregorianCalendar, SillyDate> { 
    public SillyDate unmarshal(XMLGregorianCalendar val) throws Exception { 
     return new SillyDate(val.getYear(), val.getMonth(), val.getDay()); 
    } 

    public XMLGregorianCalendar marshal(SillyDate val) throws Exception { 
     return DatatypeFactory.newInstance().newXMLGregorianCalendarDate(val.year, val.month, val.day, 0); 
    } 
} 

今、あなたはあなた自身のクラスでは、このようにすることを使用することができます。幸せに適応!

+0

JesperSMありがとう!私は、package-info.javaで@XmlJavaTypeAdapterアノテーションを使用します。しかし、次に、私はJavaでpackage-info.javaを使う方法を知らない。私はJavaクラスのコンパイルにAntタスクを使用しますが、package-info.javaは除外されていますか? – Take

+1

package-info.javaというファイルをパッケージに入れるだけで、パッケージが取得されます。比較のために、 'xjc'を通して単純なスキーマを実行し、それが何を生成するかを見てください。あなたが答えに満足しているなら、それを合格とマークすることを忘れないでください。 – JesperSM

+0

package-info.javaを使った例については、別の質問への私の答えを見てください:http://stackoverflow.com/questions/4687188/how-to-convert-dateactionscript-3-to-java-util-date-through- a-xml/4694496#4694496 –

関連する問題