Статьи

JAXB и XmlAdapters уровня пакета

Механизм 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