2013-02-15 101 views
5

我想標註一個Java類創建JAXB模式與具有價值屬性的元素。代碼如下:帶有Object類型的JAXB屬性拋出空指針異常?

@XmlAttribute(name="value") 
    public Object getSettingValue() { 
     return this.settingValue; 
    } 

    public void setSettingValue(final Object settingValue) { 
     this.settingValue = settingValue; 
    } 

當我嘗試生成模式(使用Eclipse的非莫西實現),我得到這個空指針異常:

Exception in thread "main" java.lang.NullPointerException 
    at com.sun.xml.internal.bind.v2.runtime.reflect.TransducedAccessor.get(TransducedAccessor.java:154) 
    at com.sun.xml.internal.bind.v2.runtime.property.AttributeProperty.<init>(AttributeProperty.java:56) 
    at com.sun.xml.internal.bind.v2.runtime.property.PropertyFactory.create(PropertyFactory.java:93) 
    at com.sun.xml.internal.bind.v2.runtime.ClassBeanInfoImpl.<init>(ClassBeanInfoImpl.java:145) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getOrCreate(JAXBContextImpl.java:479) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:305) 
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1100) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:143) 
    at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:110) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:376) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) 
    at org.eclipse.jpt.jaxb.core.schemagen.Main.buildJaxbContext(Main.java:95) 
    at org.eclipse.jpt.jaxb.core.schemagen.Main.generate(Main.java:76) 
    at org.eclipse.jpt.jaxb.core.schemagen.Main.execute(Main.java:62) 
    at org.eclipse.jpt.jaxb.core.schemagen.Main.main(Main.java:47) 

當我做了這個一個@XmlElement代替一個屬性,模式生成沒有問題,所以它必須與此相關。有任何想法嗎?

+0

您的屬性必須是「對象」類型還是可以將其更改爲「字符串」? – 2013-02-15 17:14:07

+0

@BlaiseDoughan我們將傳入各種類型的對象 - 整型,布爾或字符串(也可能是其他類型,因爲我們擴展了我們的應用程序)。我不知道我們是否可以將其更改爲字符串。我們可以創建一個獨立的setter,它將採用String。 – chama 2013-02-15 17:24:29

+1

@BlaiseDoughan我可以改變它的字符串,然後通過我的真實方法。謝謝! – chama 2013-02-15 17:42:09

回答

3

NullPointerException你看到似乎是由於在JAXB參考實現中的錯誤。您可以使用以下鏈接輸入錯誤。

使用EclipseLink JAXB (MOXy)爲您的JAXB提供者時,不會出現類似的異常。

解決方法

你可以改變屬性爲String類型,而不是。 Object類型的屬性無論如何都不會像元素那樣往返,屬性沒有任何機制來包含輸入信息。


當我做了這個一個@XmlElement,而不是一個屬性,模式 是沒有問題的產生,所以它必須是做些什麼。

的Java模型(根)

Object是當映射到XML元素的有效屬性類型。

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Root { 

    private Object settingValue; 

    public Object getSettingValue() { 
     return settingValue; 
    } 

    public void setSettingValue(final Object settingValue) { 
     this.settingValue = settingValue; 
    } 

} 

這是因爲XML元素可以包含xsi:type屬性形式的鍵入信息。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <settingValue 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:xs="http://www.w3.org/2001/XMLSchema" 
     xsi:type="xs:int">123</settingValue> 
</root> 
+0

對不起,但我不認爲這是一個錯誤。 Xml屬性不能有複雜的類型。看到我的答案。 – Puce 2013-02-15 21:18:47

+0

@Puce - String,Integer,Date都是Object的實例,它們不對應於XML中的複雜類型,並且可以用XML中的屬性表示。至少這是一個NPE拋出的錯誤,而不是一個更好的例外。 – 2013-02-15 21:24:06

+0

恩,NPE不好,我同意,但屬性只能有映射到內置類型的類型,例如,字符串,整型,日期或映射到簡單類型的類型。但不是複雜的類型。這是因爲XML/XSD只允許內置類型和簡單類型的屬性。 – Puce 2013-02-15 21:38:28

1

屬性類型都映射到內置的數據類型的模式或模式簡單類型。

類型對象不符合這些標準。

http://www.w3schools.com/schema/el_attribute.asp

http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/annotation/XmlAttribute.html

+0

你說的是,只要該類型可以映射到Xml(使用JAXB),XmlAttriubte可以是任何Type,但是Object不能被映射? – chama 2013-02-15 17:28:44

+0

我沒有詳細地嘗試過它,但據我瞭解,你可以使用映射到類型的類型,如int,boolean,BigInteger,date/time/dateTime等,或者帶有單個屬性的類型,與@XmlValue:http://fusesource.com/docs/esb/4.2/jaxws/JAXWSCustomTypeMappingSimple.html – Puce 2013-02-15 17:44:11