2010-04-22 88 views
10

我有一個帶有抽象超類的JAXB註釋類的包。我想在Web服務接口中使用這個超類,所以我可以通過任何一個子類作爲參數。當我這樣做,則拋出異常:Java Web服務/ JAXB - 抽象超類

javax.xml.ws.WebServiceException: javax.xml.bind.UnmarshalException 
- with linked exception: 
[javax.xml.bind.UnmarshalException: Unable to create an instance of xxx.yyy.ZZZ 
- with linked exception: 
[java.lang.InstantiationException]] 

它可以手動馬歇爾/解組&通參數爲一個字符串,但我想,以避免它。任何想法如何做到這一點?

+0

對JAXB並不瞭解,但必須有一個原因,爲什麼不能創建實例。有xxx.yyy.ZZZ一個公共無參數構造函數嗎? – 2010-04-22 07:55:23

+0

'xxx.yyy.ZZZ'是已編組的實際對象的抽象超類的名稱。壞消息是,在解組時,jaxb試圖實例化這個超類,而不是被傳遞的對象的實際類。 – 2010-04-22 08:26:01

+0

在試圖解除調用的系統/類路徑中是xxx.yyy.ZZZ嗎? – fish 2010-04-22 09:24:26

回答

9

您是否在Web服務請求中指定了具體的實現?這對我來說工作得很好:

抽象基類:

@XmlSeeAlso({Foo.class, Bar.class}) 
public abstract class FooBase 
{ 
    ... 
} 

實現類:

@XmlRootElement(name = "foo") 
public class Foo extends FooBase 
{ 
    ... 
} 

Web服務方法:

public String getFoo(@WebParam(name = "param") final FooBase foo) 
{ 
    ... 
} 

請求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://service.example/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <ser:getFoo> 
     <param xsi:type="ser:foo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/> 
     </ser:getFoo> 
    </soapenv:Body> 
</soapenv:Envelope> 
+2

@XmlSee也拯救了我的生命! – 2012-03-26 13:42:27

1

我今天解決了同樣的問題。 我發現EclipseLink MOXy JAXB實現工作,但沒有單獨的jar或maven模塊可用(它只是作爲整個eclipselink.jar,這是巨大的) 最後我嘗試了最新的JAXB版本(2.2.2),並且令人驚訝地它運作良好。

Maven的配置:

<dependency> 
     <groupId>javax.xml.bind</groupId> 
     <artifactId>jaxb-api</artifactId> 
     <version>2.2.2</version> 
    </dependency> 
    <dependency> 
     <groupId>com.sun.xml.bind</groupId> 
     <artifactId>jaxb-impl</artifactId> 
     <version>2.2.2</version> 
    </dependency> 
+0

對不起,我錯了,有maven化形式的MOXY可以在這裏找到:http://wiki.eclipse.org/EclipseLink/Maven – 2011-05-20 17:52:34