が注釈されているパッケージが適応される 非バインド可能なタイプのパッケージとは何かを持っている必要性があるように表示されません。それは便利で素敵です。
これは正しいです。 @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;
}
}
デモ
次のコードは、Foo
とBar
の両方のインスタンスを作成し、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);
}
}
出力
bar
内name
要素の値が大文字に変換された方法注意:
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<name>Foo</name>
</foo>
<?xml version="1.0" encoding="UTF-8"?>
<bar>
<name>BAR</name>
</bar>
非常に役に立ちます。ありがとう。グラフはそこから歩いていくのですか?つまり、JAXBにフィードするバインディング可能なタイプが1つあるとします。さらに、彼のパッケージに647 'XmlJavaTypeAdapter'アノテーションが付いているとします。各アノテーションはバインド不可能な型とその型のアダプタを指定しています。私の 'JAXBContext'は現在647のすべての適応型を扱えるようになりますか? –
@Laird:はい、(a)あなたがそれを処理するRAMを持っていて、(b)すべてのバインド可能なタイプがそのパッケージに含まれていた限りです。 – skaffman
興味深い。私はプロセス全体をブートストラップしなければならないと奇妙に思えます。つまり、JAXBに1つのタイプだけを供給して複数のアダプターを組み立てることができれば、JAXBを改善して、その1つのタイプを必要としないようにしたいと考えています。 JAXBのデフォルトでは、 "root"の 'package-info'をどこかに見て、最初のブートストラップは不要です。あなたの助けをもう一度ありがとう。 –