我正在将一个使用@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>
有谁知道我做错了什么?
答案 0 :(得分:0)
生成的WSDL存在许多问题(请注意,它不是手工制作的)。我没有更改任何特定内容,这表明为什么抛出了这个特殊异常(或者为什么,例如,生成错误的WSDL时没有失败)。
一旦我调整了注释以便创建了有效的WSDL,那么我还有其他问题,即我正在使用的JAX-WS版本。我最终升级了JBoss使用的版本,这反过来导致我需要将更新的JAX-WS jar放在我的JRE背书目录中。
我不打算详细说明我所做的更详细,因为没有具体的事情可以解决这个问题。如果其他人看到它,我会建议您在用于生成WSDL的注释中非常具体,并仔细查看您的WSDL。