2013-02-15 53 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