Механизм XmlAdapter в JAXB ( JSR-222 ) позволяет преобразовать не отображаемый класс в сопоставляемый. XMLAdapter может быть зарегистрирован в @XmlJavaTypeAdapter на поле, собственность, тип, или уровень пакета. Этот пост будет посвящен сфере действия XmlAdapter при регистрации на уровне пакета.
Пакет 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>
От http://blog.bdoughan.com/2012/02/jaxb-and-package-level-xmladapters.html