2011-11-30 86 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>可能卡住了,但是這是真是可惡