Пакет 1 — xmladapter.bar
package-info
Когда XmlAdapter зарегистрирован на уровне пакета, он должен включать параметр типа . Параметр type указывает класс Java, к которому будет применен этот XmlAdapter. Для этого пакета ( xmladapter.bar ) мы будем указывать XmlAdapter ( StringAdapter ), который будет применяться ко всем полям / свойствам типа String в этом пакете.
@XmlJavaTypeAdapters({
@XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class)
})
package xmladapter.bar;
import javax.xml.bind.annotation.adapters.*;
StringAdapter
Наш XmlAdapter просто преобразует все экземпляры String в верхний регистр при сортировке:
package xmladapter.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();
}
}
Bar
Bar представляет POJO в этом пакете со свойством ( именем ) типа String :
package xmladapter.bar;
public class Bar {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Пакет 2 — xmladapter.foo
Foo
Foo представляет объект домена со свойством типа String, которое существует в другом пакете ( xmladapter.foo ). XMLAdapter мы зарегистрировали для xmladapter.bar пакета не будет применяться к Струнные полей / свойств этого класса:
package xmladapter.foo;
import javax.xml.bind.annotation.*;
import xmladapter.bar.Bar;
@XmlRootElement
@XmlType(propOrder={"name", "bar"})
public class Foo {
private String name;
private Bar bar;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Bar getBar() {
return bar;
}
public void setBar(Bar bar) {
this.bar = bar;
}
}
Демонстрация
Следующий код создаст экземпляры Foo и Bar и перенаправит их в XML. Обратите внимание, что значения, заданные в свойствах имени для Foo и Bar , строчные:
package xmladapter;
import javax.xml.bind.*;
import xmladapter.bar.Bar;
import xmladapter.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");
Bar bar = new Bar();
bar.setName("bar");
foo.setBar(bar);
marshaller.marshal(foo, System.out);
}
}
Выходные данные
Обратите внимание, что значение элемента name в строке bar было преобразовано в верхний регистр (строка 5), а в элементе name внутри foo нет (строка 3):
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<name>foo</name>
<bar>
<name>BAR</name>
</bar>
</foo>
Дальнейшее чтение
Если вам понравился этот пост, вас также могут заинтересовать:
digg_url = ‘http://blog.bdoughan.com/2012/02/jaxb-and-package-level-xmladapters.html’;
От http://blog.bdoughan.com/2012/02/jaxb-and-package-level-xmladapters.html