Класс JAXB Annotated - установка переменной, которая не является элементом

У меня есть аннотированный класс 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. Значения для имени и адреса установлены правильно. Однако значение set теряется (поскольку это @XMLTransient, оно игнорируется)

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


person sswdeveloper    schedule 05.04.2010    source источник


Ответы (3)


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

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

person skaffman    schedule 05.04.2010
comment
Привет, спасибо за решение. Я пробовал это, но ни одно из значений элемента XML не устанавливается (имя, адрес). Можно ли добавлять эти аннотации к методам? - person sswdeveloper; 06.04.2010
comment
@sswdeveloper: Да, это действительно так, но иногда приходится немного жонглировать. Попробуйте аннотировать методы установки, а не методы получения. - person skaffman; 06.04.2010

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

person Vanchinathan Chandrasekaran    schedule 30.07.2010

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

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

person Bozho    schedule 05.04.2010
comment
Я мог бы это сделать, но набор содержит только те элементы, которые были установлены в XML, а не какие-либо другие элементы. Таким образом, выполнение постобработки будет включать повторный анализ XML, а затем установку значений/чтение всех членов класса и проверку того, установлены ли они. Однако это устраняет весь смысл использования JAXB и может привести к снижению производительности. Есть ли другая альтернатива использованию самого JAXB? Спасибо. - person sswdeveloper; 06.04.2010
comment
@sswdeveloper нет, постобработка будет включать только разбор аннотаций JAXB. - person Bozho; 06.04.2010