关于 java:Integer 到 int 使用 jaxb

Integer to int using jaxb

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

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

1
2
3
4
5
6
7
8
9
10
11
public class Foo {
    int bar;

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

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

我已尝试添加:

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

到getter(和setter),改变模式中字段的类型,但这没有帮助。

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

我无法修改类,例如,我无法将 bar 更改为 Integer 或添加原始类型的新 setter,但我可以添加注释。


从手机发帖,请多多包涵!
正如您可能知道的那样,该属性与 javabeans 规范不匹配,所以这就是问题所在。您能否使用新名称添加一个新的 setter/getter 对,它们都使用 Integer,并将 XML 标记放在该新属性上?新方法只会委托给现有方法。 HTH


您可以通过将 JAXB 配置为使用字段访问来解决此问题。这是通过 @XmlAccessorType 注释完成的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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);
    }

}

更多信息

  • http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html


很遗憾你不能引入任何额外的方法。如果你可以添加一个额外的私有方法,你可以这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@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>,但这真的很讨厌。