使用jaxb整数到int

时间:2011-11-30 22:54:34

标签: java jaxb jax-ws cxf wsdl2java

我有一种奇怪的情况,即类中的getter返回一个原始int类型,而setter采用Integer类。

当jaxb将一个元素解组为此类时,它找不到它正在寻找的setter:

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(和setter),来改变模式中字段的类型,但这没有帮助。

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

我无法修改类,因为我无法将条形图更改为整数或添加具有基本类型的新setter,但我可以添加注释。

3 个答案:

答案 0 :(得分:3)

从手机发帖所以请耐心等待! 该属性与javabeans规范不匹配,因此您可能知道这是问题所在。您是否可以使用新名称添加新的setter / getter对,它们都使用Integer,并将XML标记放在该新属性上?新方法只会委托现有方法。 HTH

答案 1 :(得分:2)

您可以通过将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);
    }

}

了解更多信息

答案 2 :(得分: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>,但那非常讨厌