2012-01-04 4 views
7

私はBlaise Doughan's answer to a question on this subjectを勉強しましたが、さらなる質問があります。XmlJavaTypeAdapterでどのパッケージ情報に注釈を付けるのですか?

XmlJavaTypeAdaptersは、XmlJavaTypeAdapterの注釈を列挙できます。それぞれの注釈は、バインド不可能な型がJAXBによってバインド可能な型にどのようにマップされるかを管理します。

この注釈はパッケージレベルで使用できます。そうすると、XmlJavaTypeAdapter注釈はすべてtype()属性を完全に指定する必要があります。

注釈されているパッケージには、適用されているバインド不可能なタイプのパッケージと何らかの関係があるという要件はないようです。それは便利で素敵です。

しかし、アノテートされたパッケージとタイプのパッケージとの間に関係がない場合、JAXBはどのようにパッケージレベルのXmlJavaTypeAdaptersアノテーションを検出しますか?言い換えれば、潜在的なXmlJavaTypeAdapters注釈のために相談するパッケージをどのように知っていますか?私の.earファイルのlibディレクトリの.jarファイルにランダムなパッケージを作成して、バインド不可能なすべてのタイプのすべてのアダプタで注釈が付けられた1つの巨大なpackage-infoクラスを含むクラスを作成できますか?

答えて

7

JAXBランタイムがJAXBアノテーション付きクラスを読み込むと、そのクラスと同じパッケージ内のpackage-info.javaが検索され、パッケージレベルの注釈が検索されます。したがって、XmlJavaTypeAdaptersは「バインド不可」タイプと同じパッケージに存在する必要はありませんが、が「バインド可能」タイプと同じパッケージに存在する必要があります。例えば

、私はパッケージYタイプBの性質を持っているパッケージX、で、JAXB注釈付きクラスAを持っていると言います。 Bプロパティをバインドするには、タイプアダプタが必要であるとします。そのアダプタはAで指定することも、のpackage-info.javaで指定することもできます。パッケージYはかなり恣意的で、JAXBランタイムには関心がありません。

私はそれが理にかなっていると思います。

+0

非常に役に立ちます。ありがとう。グラフはそこから歩いていくのですか?つまり、JAXBにフィードするバインディング可能なタイプが1つあるとします。さらに、彼のパッケージに647 'XmlJavaTypeAdapter'アノテーションが付いているとします。各アノテーションはバインド不可能な型とその型のアダプタを指定しています。私の 'JAXBContext'は現在647のすべての適応型を扱えるようになりますか? –

+0

@Laird:はい、(a)あなたがそれを処理するRAMを持っていて、(b)すべてのバインド可能なタイプがそのパッケージに含まれていた限りです。 – skaffman

+0

興味深い。私はプロセス全体をブートストラップしなければならないと奇妙に思えます。つまり、JAXBに1つのタイプだけを供給して複数のアダプターを組み立てることができれば、JAXBを改善して、その1つのタイプを必要としないようにしたいと考えています。 JAXBのデフォルトでは、 "root"の 'package-info'をどこかに見て、最初のブートストラップは不要です。あなたの助けをもう一度ありがとう。 –

5

が注釈されているパッケージが適応される 非バインド可能なタイプのパッケージとは何かを持っている必要性があるように表示されません。それは便利で素敵です。

これは正しいです。 @XmlJavaTypeAdapterをパッケージレベルで使用する場合、このパッケージに含まれるクラスの指定された型のすべてのプロパティにこのアダプタを適用することを意味します。私は例をあげて以下に説明します。このパッケージの

forum8735737.bar.package-情報

私たちは、このパッケージ内のタイプStringのすべてのフィールド/プロパティに適用されますXmlAdapterを指定します。

@XmlJavaTypeAdapters({ 
    @XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class) 
}) 
package forum8735737.bar; 

import javax.xml.bind.annotation.adapters.*; 

forum8735737.bar。StringAdapter

当社のマーシャリングするときXmlAdapterは、単に大文字にStringのすべてのインスタンスを変換します:

package forum8735737.bar; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class StringAdapter extends XmlAdapter<String, String> { 

    @Override 
    public String unmarshal(String v) throws Exception { 
     return v; 
    } 

    @Override 
    public String marshal(String v) throws Exception { 
     if(null == v) { 
      return v; 
     } 
     return v.toUpperCase(); 
    } 

} 

forum8735737.bar.Bar

Barはのプロパティで、このパッケージでPOJOを表しタイプString

package forum8735737.bar; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Bar { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

forum8735737.foo.Foo

fooが別のパッケージに存在するタイプStringのプロパティを持つドメインオブジェクトを表します。私たちはforum8735737.barパッケージの登録XmlAdapterは、このクラスには適用されません。

package forum8735737.foo; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Foo { 

    private String name; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

} 

デモ

次のコードは、FooBarの両方のインスタンスを作成し、XMLにそれらをマーシャリングします:

package forum8735737; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

import forum8735737.bar.Bar; 
import forum8735737.foo.Foo; 

public class Demo { 

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

     Foo foo = new Foo(); 
     foo.setName("Foo"); 
     marshaller.marshal(foo, System.out); 

     Bar bar = new Bar(); 
     bar.setName("Bar"); 
     marshaller.marshal(bar, System.out); 
    } 

} 

出力

barname要素の値が大文字に変換された方法注意:

<?xml version="1.0" encoding="UTF-8"?> 
<foo> 
    <name>Foo</name> 
</foo> 
<?xml version="1.0" encoding="UTF-8"?> 
<bar> 
    <name>BAR</name> 
</bar> 
関連する問題