我正在将带有 @WebService 注释的 StatelessSessionBean 部署到 JBoss。我正在使用 JBoss 生成的 WSDL 来生成客户端存根。我的问题是调用一个返回对象列表的方法。如果列表为空,则调用成功,但是如果列表不为空,则出现以下异常:
com.sun.xml.ws.encoding.soap.DeserializationException: Failed to read a response: javax.xml.bind.UnmarshalException
- with linked exception:
[javax.xml.bind.UnmarshalException: Unable to create an instance of com.companyname.api.ws.DataItemType
- with linked exception:
[java.lang.InstantiationException]]
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:124)
at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:89)
at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:118)
at $Proxy34.getWorkflows(Unknown Source)
at com.companyname.api.SimpleClient.go(SimpleClient.java:48)
在网上搜索让我在这里进行了这个讨论:http: //forums.java.net/jive/message.jspa?messageID=281780
但是,我已经正确设置了 @XmlSeeAlso 内容,并且它存在于生成的存根类中。我可以确认 DataItemType 类是抽象的,因此尝试实例化它会导致问题也就不足为奇了。我根本不清楚为什么要实例化 DataItemType 类(因为它是抽象的)。这是从服务器返回的 XML(它看起来对我来说是正确的):
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'>
<env:Header></env:Header>
<env:Body>
<ns2:getWorkflowsResponse xmlns:ns2="http://ws.api.companyname.com/">
<return>
<id>
<identifier>1</identifier>
<version>0</version>
</id>
<goal>ENROLL</goal>
<dataItemType xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="DataItemTypeText">
<attributeName>email</attributeName>
<displayName>Email Address</displayName>
</dataItemType>
...
</return>
</ns2:getWorkflowsResponse>
</env:Body>
</env:Envelope>
有谁知道我做错了什么?