2010-04-22 89 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