2012-02-21 73 views
3

我無法獲得由Java的JAXB實現編組的以下類結構。我有一個抽象標識符類,它有一個值。JAXB和多態性

對我來說,重要的是價值應該歸屬於一個屬性。

@XmlSeeAlso({ 
    AbstractIDInt.class 
}) 
@XmlRootElement(name = "AbstractID") 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public abstract class AbstractID { 

    @XmlAttribute 
    abstract Object getValue(); 
} 

而且,這裏是一個擴展了抽象的ID類的類:如果你試圖馬歇爾一些類型AbstractID的

@XmlRootElement(name = "AbstractIDInt") 
@XmlAccessorType(XmlAccessType.NONE) 
public class AbstractIDInt extends AbstractID { 
    Integer value; 

    Integer getValue() { 
     return value; 
    } 

    public void setvalue (Integer value) { 
     this.value = value; 
    } 
} 

目前Java的JAXB實現只是拋出一個異常。

這是違反JAXB標準中的某些東西還是Java的JAXB實現中斷?

回答

3

JDK中包含的JAXB的實現可能存在一個錯誤。使用JDK 1.6.0_29我拿到那你很可能看到了異常:

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 forum9382200.Demo.main(Demo.java:9) 

EclipseLink JAXB (MOXy)運行相同的演示代碼,我得到下面的輸出(我是莫西鉛):

<?xml version="1.0" encoding="UTF-8"?> 
<AbstractIDInt value="1"/> 

以下是演示代碼,我用:

package forum9382200; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(AbstractID.class); 

     AbstractIDInt abstractIDInt = new AbstractIDInt(); 
     abstractIDInt.setvalue(1); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.marshal(abstractIDInt, System.out); 
    } 

} 

對於更多Infomration:


UPDATE

如果您需要使用JAXB RI包含在Java SE,你可以嘗試以下方法:

AbstractID

馬克父類爲@XmlTransient

package forum9382200; 

import javax.xml.bind.annotation.*; 

@XmlSeeAlso({ 
    AbstractIDInt.class 
}) 
@XmlTransient 
public abstract class AbstractID { 

    abstract Object getValue(); 
} 

AbstractIDInt

註釋value屬性的子類:

package forum9382200; 

import javax.xml.bind.annotation.*; 

@XmlRootElement(name = "AbstractIDInt") 
@XmlAccessorType(XmlAccessType.NONE) 
public class AbstractIDInt extends AbstractID { 
    Integer value; 

    @XmlAttribute 
    Integer getValue() { 
     return value; 
    } 

    public void setvalue (Integer value) { 
     this.value = value; 
    } 
} 

更多信息

+0

謝謝。任何想法如何我可以註釋AbstractID以使其與Java的JAXB實現一起工作?我通過CXF使用JAXB來生成WSDL。我需要從WSDL生成的代碼通過getValue()方法生成AbstractID。 – rouble 2012-02-21 18:27:16

+0

@prmatta - 我添加了一個可以與JAXB RI一起使用的更新。 – 2012-02-21 18:38:04

+0

我認爲與此相關的問題是,在生成的WSDL以及從WSDL生成的代碼中,AbstractID現在將是一個空類,而AbstractIDInt具有「值」字段。所以,想要獲得值的人首先需要投影到AbstractIDInt。這並不理想 - 因爲無法知道投射到哪個派生類型。我需要一種方法,即字段「值」需要從AbstractID繼承。任何其他想法? – rouble 2012-02-21 18:57:45