JAXB Annotated class - установка переменной, которая не является элементом - PullRequest
3 голосов
/ 06 апреля 2010

У меня есть аннотированный класс JAXB, скажем

@XmlRootElement(namespace = "http://www.abc.com/customer")
Class Customer{
@XmlElement(namespace = "http://www.abc.com/customer")
  private String  Name;
  @XmlElement(namespace = "http://www.abc.com/customer")
  private String  Address;
 @XmlTransient
  private HashSet set = new HashSet();

  public String getName(){
    return Name;
  }
  public void  setName(String  name){
    this.Name = name;
    set.add("Name");
  }


  public String getAddress(){
    return Address;
  }
  public void  setAddress(String  address){
    this.Address = address;
    set.add("Address");
  }

  public void getSet(){
return set;
}

У меня есть XML вида

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Customer xmlns="http://www.abc.com/customer" >
<Name>Ralph</Name>
<Address>Newton Street</Address>
</Customer>

Я использую демаршаллинг JAXB, чтобы получить объектное представление ввода XML. Значения для имени и адреса установлены правильно. тем не мение значение множества теряется (поскольку оно @XMLTransient, оно игнорируется)

Есть ли способ убедиться, что он все еще находится в объекте, который был разобран? Какая-нибудь другая аннотация, которую я могу использовать?

Ответы [ 3 ]

3 голосов
/ 06 апреля 2010

Попробуйте поместить аннотации на методы, а не на поля. В частности, поместите @XmlElement на getName() и getAddress(), поместите @XmlTransient на getSet() и удалите все аннотации из полей.

JAXB должен затем использовать пары методов получения / установки для ввода / извлечения данных, а не полей, и поскольку setAddress() добавляет значение в поле set, оно должно работать так, как вы ожидаете. Кроме того, поскольку getSet() помечен как переходный, содержимое set не должно быть снова маршалировано.

2 голосов
/ 30 июля 2010

Чтобы избежать всего этого кода котельной пластины аннотации XmLElement по всему коду. Вы можете пойти дальше и использовать @XmlAccessType.PROPERTY в верхней части класса, и вы можете удалить все @XmlElement Аннотации. Аннотация XmlAccessType позволяет JAXB смотреть на установщики и получатели, а не на само поле.

0 голосов
/ 06 апреля 2010

Я предлагаю использовать какую-нибудь постпроцессорную утилиту для заполнения вашего набора. Возможно, используя отражение или самоанализ.

Обратите внимание, что постпроцессор должен проверять только аннотации JAXB, а не файл XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...