JAXB Annotated class - 设置不是元素的变量

时间:2010-04-05 20:28:43

标签: java jaxb

我有一个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忽略了)

有没有办法确保它仍然被设置在已经解组的对象中?我可以使用其他一些注释吗?

3 个答案:

答案 0 :(得分:3)

尝试将注释放在方法而不是字段上。具体而言,将@XmlElement放在getName()getAddress()上,将@XmlTransient放在getSet()上,然后从字段中删除所有注释。

然后JAXB应该使用getter / setter方法对来注入/检索数据而不是字段,并且因为setAddress()将值添加到set字段,这应该按预期工作。此外,由于getSet()被标记为瞬态,因此set的内容不应再被编组。

答案 1 :(得分:2)

在整个代码中避免所有这些XmLElement注释的样板代码。您可以继续使用课程顶部的@XmlAccessType.PROPERTY,然后删除所有@XmlElement注释。 XmlAccessType注释负责告诉JAXB查看setter和getter而不是字段本身。

答案 2 :(得分:0)

我建议使用一些后处理器实用程序来填充你的设置。也许使用反思或内省。

请注意,后处理器只需要检查JAXB注释,而不是xml文件。