2011-11-30 53 views
4

我有一个奇怪的情况,其中类中的getter返回基本int类型,并且setter接受一个I​​nteger类。使用jaxb将整数转换为int

当JAXB解组这一类的元素,它不能找到它正在寻找二传手:

public class Foo { 
    int bar; 

    public int getBar() { 
     return this.bar; 
    } 

    public void setBar(Integer bar) { 
     this.bar = bar.intValue(); 
    } 
} 

我曾尝试加入:

@XmlElement (type = java.lang.Integer.class, name = "bar") 

吸气剂(和二传) ,来改变模式中的字段的类型,但这没有帮助。

解组期间,我得到这个错误:该属性有一个getter“public int com.example.getBar()”但没有setter。对于解组,请定义setters。

我无法修改类,因为我无法将条更改为整数或添加了一个具有原始类型的新setter,但我可以添加注释。

回答

1

您可以通过配置JAXB使用字段访问来解决此问题。这是通过@XmlAccessorType注解来实现:

package forum8334195; 

import javax.xml.bind.Unmarshaller; 
import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Foo { 
    int bar; 

    public int getBar() { 
     return this.bar; 
    } 

    public void setBar(Integer bar) { 
     this.bar = bar.intValue(); 
    } 

    /** 
    * Put logic to update domain object based on bar field here. This method 
    * will be called after the Foo object has been built from XML. 
    */ 
    private void afterUnmarshal(Unmarshaller unmarshaller, Object parent) { 
     System.out.println(bar); 
    } 

} 

更多信息

+0

好点,虽然那会一起跳过setBar()。我们在setter中有一些需要执行的业务逻辑。 – rouble

+0

@prmatta - 这是业务逻辑,你可以在XmlAdapter或afterUnmarshal事件中做些什么。 –

+0

可能 - XMLAdapter如何在这里帮助? – rouble

2

从手机发布,让我忍受! 该属性与javabeans规范不匹配,因此您可能知道这是问题所在。你可以用一个新的名字添加一个新的setter/getter对,它们都使用Integer,并把XML标签放在这个新的属性上?新方法只是委托给现有的方法。 HTH

0

这是你不能引入任何额外的方法,一个真正的耻辱。如果你可以添加一个额外的私人方法,你可以这样做:

@XmlAccessorType(XmlAccessType.NONE) 
public class Foo { 
    int bar; 

    public int getBar() { 
     return this.bar; 
    } 

    @XmlElement 
    private Integer getBar() { 
     return this.bar; 
    } 

    public void setBar(Integer bar) { 
     this.bar = bar.intValue(); 
    } 
} 

如果不工作,你使用@XmlJavaTypeAdaptorXmlAdaptor<Foo, YourAdaptedFoo>可能卡住了,但是这是真是可恶