2010-04-05 41 views
3

我有一个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 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 XML输入的对象表示。名称和地址的值设置正确。但是 set的值会丢失(因为它是@XMLTransient会被忽略)

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

回答

3

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

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

+0

嗨, 感谢您的解决方案。我试过这个,但没有设置XML元素值(名称,地址)是否将这些注释添加到方法中是否有效? – sswdeveloper 2010-04-06 07:25:05

+0

@sswdeveloper:这是有效的,是的,但有时候你必须做一些事情。尝试注释setter方法而不是getter方法。 – skaffman 2010-04-06 07:32:49

0

我建议使用一些后处理工具来填充你的设置。也许使用反思或反思。

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

+0

我可以这样做,但该集只包含那些已经在XML中设置的元素,而不包含任何其他元素。因此,进行后期处理将涉及再次解析XML,然后设置值/读取所有类成员并检查是否已设置。然而,这消除了使用JAXB的全部重点,并且会成为一个性能问题。有没有其他的选择使用JAXB itsef? 谢谢。 – sswdeveloper 2010-04-06 07:27:37

+0

@sswdeveloper否,后处理将仅包含解析JAXB注释。 – Bozho 2010-04-06 07:39:55

2

避免所有代码中的所有这些锅炉板代码的XmLElement注释。你可以继续在课程顶部使用@XmlAccessType.PROPERTY,你可以去掉所有的@XmlElement注解。 XmlAccessType注释负责告诉JAXB查看setter和getters,而不是字段本身。

相关问题