[jboss-user] [JBossWS] - Abstract class as input Parameter in WebService

vesposito do-not-reply at jboss.com
Thu Jan 22 04:23:24 EST 2009


Hi, I've a problem to use abstract class in a Web Service like WebMethod input parameter. I'm using JBOSS-4.2.2.GA and JBOSSWS-NATIVE-3.0.3. Specifically, I've read a lot of documents and example about how to use @XmlSeeAlso annotation and there are two different kinds explained: 
1) use it in WebService class reporting classes that extend Abstract class or 
2) use it in Abstract class. 
The first one doesn't generate stubs (using wsconsume) relative to real Classes, so it's not possible use them client-side, the second one instead generates them so client can create a class to use like parameter in WebMethod.
Supponing that the second way it's the correct one, i generate stubs to use them client side and this is code about service, abstract class and real class:

WakeRider.java
 
  | @WebService(serviceName="WakeRider")
  | @Stateless
  | 
  | public class WakeRider {
  | 
  | 	public String showItem(Item item) {
  |         try {
  |         	if(item instanceof Tower)
  |         		System.out.println("inside");
  |            return ((Tower)item).ItemName();
  |         } catch (Exception e) {
  |             e.printStackTrace();
  |         }   
  |         return "";
  |     }  
  | 
  | }
  | 

Item.java

  | @XmlSeeAlso({Tower.class})
  | public abstract class Item implements Serializable {
  | 
  |     public abstract String ItemName();
  |    
  | }
  | 

Tower.java

  | @XmlType(name="Tower",propOrder={"itemName"})
  | public class Tower extends Item {
  | 
  | 	private String itemName;
  | 	
  | 	@Override
  | 	public String ItemName() {
  | 		// TODO Auto-generated method stub
  | 		return itemName;
  | 	}
  | 	public String getItemName() {
  | 		return itemName;
  | 	}
  | 	public void setItemName(String itemName) {
  | 		this.itemName = itemName;
  | 	}	
  | }
  | 

Generated WSDL is this:

  | <definitions name="WakeRider" targetNamespace="http://wakerider/">
  | -
  | 	<types>
  | -
  | 	<xs:schema targetNamespace="http://wakerider/" version="1.0">
  | <xs:element name="showItem" type="tns:showItem"/>
  | <xs:element name="showItemResponse" type="tns:showItemResponse"/>
  | -
  | 	<xs:complexType name="showItem">
  | -
  | 	<xs:sequence>
  | <xs:element minOccurs="0" name="arg0" type="tns:item"/>
  | </xs:sequence>
  | </xs:complexType>
  | -
  | 	<xs:complexType abstract="true" name="item">
  | <xs:sequence/>
  | </xs:complexType>
  | -
  | 	<xs:complexType name="Tower">
  | -
  | 	<xs:complexContent>
  | -
  | 	<xs:extension base="tns:item">
  | -
  | 	<xs:sequence>
  | <xs:element minOccurs="0" name="itemName" type="xs:string"/>
  | </xs:sequence>
  | </xs:extension>
  | </xs:complexContent>
  | </xs:complexType>
  | -
  | 	<xs:complexType name="showItemResponse">
  | -
  | 	<xs:sequence>
  | <xs:element minOccurs="0" name="return" type="xs:string"/>
  | </xs:sequence>
  | </xs:complexType>
  | </xs:schema>
  | </types>
  | -
  | 	<message name="WakeRider_showItemResponse">
  | <part element="tns:showItemResponse" name="showItemResponse"/>
  | </message>
  | -
  | 	<message name="WakeRider_showItem">
  | <part element="tns:showItem" name="showItem"/>
  | </message>
  | -
  | 	<portType name="WakeRider">
  | -
  | 	<operation name="showItem" parameterOrder="showItem">
  | <input message="tns:WakeRider_showItem"/>
  | <output message="tns:WakeRider_showItemResponse"/>
  | </operation>
  | </portType>
  | -
  | 	<binding name="WakeRiderBinding" type="tns:WakeRider">
  | <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
  | -
  | 	<operation name="showItem">
  | <soap:operation soapAction=""/>
  | -
  | 	<input>
  | <soap:body use="literal"/>
  | </input>
  | -
  | 	<output>
  | <soap:body use="literal"/>
  | </output>
  | </operation>
  | </binding>
  | -
  | 	<service name="WakeRider">
  | -
  | 	<port binding="tns:WakeRiderBinding" name="WakeRiderPort">
  | <soap:address location="http://localhost:8080/AbstractTest/WakeRider"/>
  | </port>
  | </service>
  | </definitions>
  | 

Using this WSDL I generate stubs to use client side. Client is defined below:

Client.java
 
  | public class Client {
  | 
  | 	public static void main(String[] args) {
  | 		WakeRider_Service srv = new WakeRider_Service();
  | 		WakeRider wr_srv = srv.getWakeRiderPort();
  | 		
  | 		Tower item=new Tower();
  | 		item.setItemName("tower");
  | 	        System.out.println(wr_srv.showItem(item));
  | 	}
  | 
  | }
  | 

When I start this client i've this Exception server side:

  | ERROR [SOAPFaultHelperJAXWS] SOAP request exception
  | javax.xml.ws.WebServiceException: javax.xml.bind.UnmarshalException: Unable to create an instance of wakerider.inventory.Item
  |  - with linked exception:
  | [java.lang.InstantiationException]
  | 	at org.jboss.ws.core.jaxws.JAXBDeserializer.handleUnmarshallException(JAXBDeserializer.java:110)
  | 	at org.jboss.ws.core.jaxws.JAXBDeserializer.deserialize(JAXBDeserializer.java:78)
  | 	at org.jboss.ws.core.binding.DeserializerSupport.deserialize(DeserializerSupport.java:58)
  | .....
  | 

Thanks for help.

View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4203905#4203905

Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4203905



More information about the jboss-user mailing list