JAXB - при генерации XML мы можем проверить значение объекта перед генерацией - PullRequest
2 голосов
/ 10 ноября 2011

Предположим, у меня есть объект

@XmlRootElement(name = "publisher")
class Person
{
 @XmlElement(required = true)
 int id;
 @XmlElement(required = true)
 String name;
}

Я хочу создать как

<person>
<id>1</id>
<name>test</name>
</person>

Предположим, если имя test10, я не хочу этот элемент в моем xml. В любом случае, чтобы реализовать это.

1 Ответ

3 голосов
/ 10 ноября 2011

Вы можете сделать следующее:

Вариант использования № 1 - Объект не маршала, основанный на элементе имени

Если человек является корневым объектом

Если Person является корневым объектом, вы можете сделать следующее, как предложено JB Nizet в комментариях к этому вопросу.

if (!"test10".equals(person.getName()) { 
    marshaller.marshal(person);
}

Если лицо является ссылочным объектом

Если Person не является корневым объектом, тогда вы можете использовать XmlAdapter для этого варианта использования. Это будет выглядеть примерно так:

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

public class PersonAdapter extends XmlAdapter<Person, Person> {

    @Override
    public Person unmarshal(Person person) throws Exception {
        return person;
    }

    @Override
    public Person marshal(Person person) throws Exception {
       if(mull == person || "test10".equals(person.getName()) {
           return null;
       }
       return person;
    }

}

XmlAdapter указывается с помощью аннотации @XmlJavaTypeAdapter. Эту аннотацию можно настроить на уровне поля / свойства, типа и пакета. Для примеров см .:

Вариант использования № 2 - элемент имени не маршала, основанный на его значении

Если вы просто хотите избежать маршалинга элемента name на основе его значения, тогда вы снова можете использовать XmlAdapter:

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

public class NameAdapter extends XmlAdapter<String, String> {

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

    @Override
    public String marshal(String string) throws Exception {
       if("test10".equals(string) {
           return null;
       }
       return string;
    }

}

Ваш класс Person будет выглядеть так:

@XmlRootElement(name = "publisher")
class Person
{
 @XmlElement(required = true)
 int id;
 @XmlElement(required = true)
 @XmlJavaTypeAdapter(NameAdapter.class)
 String name;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...