views:

75

answers:

1

I'm deploying a StatelessSessionBean annotated with @WebService to JBoss. I'm taking the WSDL generated by JBoss to generate client stubs. My problem is in calling a method which returns a list of objects. If the list is empty the call succeeds however if the list is not empty then I get the following exception:

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)

Searching the web led me to this discussion here: http://forums.java.net/jive/message.jspa?messageID=281780

However I have set the @XmlSeeAlso stuff correctly and it is present on the generated stub classes. I can confirm that the DataItemType class is abstract so it is not surprising that an attempt to instantiate it causes a problem. I'm not at all clear on why the DataItemType class is being instantiated at all (as it is abstract). This is the XML that is returned from the server (it looks about right to me):

<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'&gt;
    <env:Header></env:Header>
    <env:Body>
        <ns2:getWorkflowsResponse xmlns:ns2="http://ws.api.companyname.com/"&gt;
            <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>

Does anyone know what I'm doing wrong?

A: 

There were a number of issues with the generated WSDL (note that it wasn't a handcrafted one). There was nothing specific that I changed which indicated why this particular exception was thrown (or why, for example, there wasn't a failure when generating the incorrect WSDL).

Once I adjusted the annotations so that a valid WSDL was created then I had further issues which the JAX-WS versions I was using. I ended up upgrading the version used by JBoss which, in turn, led to me needing put the newer JAX-WS jars in my JRE endorsed directory.

I'm not going to detail what I did in any more detail as there was no specific thing that I did that addressed this problem. If anyone else sees it I would suggest being very specific in the annotations you use to generate your WSDL and taking a careful look at your WSDL.

macbutch