Ok I have managed to create a simple example of the behavior. Please note that 
I am pretty new to webservices and JBossWS (started using it a few days ago) so 
sorry if something is overly complicated. Feedback is highly appreciated. 

I am using JBoss 4.2.0.GA and java version "1.5.0_08"

I started with the following WSDL (I have modified an echo tutorial I found on 
the web so please dont be confused by the namespace and other irregularities): 


  | <?xml version="1.0" encoding="UTF-8"?>
  | <definitions name='EchoService' targetNamespace='http://echo/'
  |     xmlns='http://schemas.xmlsoap.org/wsdl/'
  |     xmlns:soap='http://schemas.xmlsoap.org/wsdl/soap/'
  |     xmlns:tns='http://echo/'
  |     xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
  |     <types>
  |             <xs:schema targetNamespace='http://echo/' version='1.0'
  |                     xmlns:tns='http://echo/'
  |                     xmlns:xs='http://www.w3.org/2001/XMLSchema'>
  |                     
  |                     <xs:complexType name='Something'>
  |                             <xs:sequence>
  |                                     <xs:element minOccurs='0' name='arg0' 
type='xs:string' />
  |                             </xs:sequence>
  |                     </xs:complexType>
  |                     
  |                     <xs:complexType name='A'>
  |                             <xs:sequence>
  |                                     <xs:element minOccurs='0' name='arg0' 
type='xs:string' />
  |                             </xs:sequence>
  |                     </xs:complexType>
  | 
  |                     <xs:complexType name='B'>
  |                             <xs:complexContent>
  |                                     <xs:extension base="tns:A">
  |                                             <xs:sequence>
  |                                                     <xs:element 
minOccurs='0' name='arg1' type='xs:string' />
  |                                             </xs:sequence>
  |                                     </xs:extension>
  |                             </xs:complexContent>
  |                     </xs:complexType>               
  |                     <xs:complexType name='C'>
  |                             <xs:complexContent>
  |                                     <xs:extension base="tns:B">
  |                                             <xs:sequence>
  |                                                     <xs:element 
minOccurs='0' name='arg2' type='xs:string' />
  |                                             </xs:sequence>
  |                                     </xs:extension>
  |                             </xs:complexContent>                            
        
  |                     </xs:complexType>
  |                     
  |                     <xs:complexType name="BResponse">
  |                             <xs:sequence>
  |                                     <xs:element name="something" 
type="tns:Something" minOccurs="1" maxOccurs="1" nillable="true"/>
  |                                     <xs:element name="b" type="tns:B" 
minOccurs="1" maxOccurs="1" nillable="true"/>
  |                             </xs:sequence>
  |                     </xs:complexType>
  |                     
  |                     <xs:element name="bResponse" type="tns:BResponse"/>
  |                     <xs:element name="something" type="tns:Something"/>
  |             </xs:schema>
  |     </types>
  |     
  |     <message name='GetB_Request' />
  |     
  |     <message name='GetB_GetBResponse'>
  |             <part name='para' element="tns:bResponse"/>
  |     </message>
  |     
  |     <portType name='GetB'>
  |             <operation name='getB' >
  |                     <input message='tns:GetB_Request'/>
  |                     <output message='tns:GetB_GetBResponse' />
  |             </operation>
  |     </portType>
  |     <binding name='GetBBinding' type='tns:GetB'>
  |             <soap:binding style='document' 
transport='http://schemas.xmlsoap.org/soap/http' />
  |             <operation name='getB'>
  |                     <soap:operation soapAction='' />
  |                     <input>
  |                             <soap:body use='literal' />
  |                     </input>
  |                     <output>
  |                             <soap:body use='literal' />
  |                     </output>
  |             </operation>
  |     </binding>
  |     <service name='GetBService'>
  |             <port binding='tns:GetBBinding' name='GetBPort'>
  |                     <soap:address location='REPLACE_WITH_ACTUAL_URL' />
  |             </port>
  |     </service>
  | </definitions>
  | 

We have an  A->B->C  Class Hierarchy here, and a BResponse Complex Type which 
consists of a "B" and a "Something". Note the "minOccurs=1 maxOccurs=1 
nillable=true " . If I throw the file at wsconsume  it creates a number of 
classes. The BResponse Class looks like this: 


  | @XmlAccessorType(XmlAccessType.FIELD)
  | @XmlType(name = "BResponse", propOrder = {
  |     "something",
  |     "b"
  | })
  | public class BResponse {
  | 
  |     @XmlElement(required = true, nillable = true)
  |     protected Something something;
  |     @XmlElement(required = true, nillable = true)
  |     protected B b;
  | ....}
  | 


I have written a very simple Server: 


  | @javax.jws.WebService(endpointInterface="echo.GetB", 
serviceName="GetBService", targetNamespace="http://echo/";, portName="GetBPort" )
  | public class DummyGetB implements GetB {
  | 
  |     public BResponse getB() {
  | 
  |             BResponse response = new BResponse();
  |             
  |             C c = new C();
  |             c.setArg0("1");
  |             c.setArg1("2");
  |             c.setArg2("3");
  |             
  |             response.setB(c);
  |             
  |             return response; 
  |     }
  | 
  | }
  | 


and a Client: 


  | public class Client {
  |     
  |     public static void main(String[] args) throws Exception  {
  |             GetBService getB = new GetBService(new 
URL("http://127.0.0.1:8080/server?wsdl";),new QName("http://echo/";, 
"GetBService"));
  |             
  |             GetB getBPort = getB.getGetBPort();
  |             BResponse bResponse = getBPort.getB();
  |             
  |             System.out.println(bResponse.getB().getClass());
  |             B b = bResponse.getB();
  |             System.out.println(b.getArg0());
  |             System.out.println(b.getArg1());
  |             C c = (C)bResponse.getB();
  |             System.out.println(c.getArg2());
  |     }
  | 

If I try this example I get: 


  | class echo.B
  | 1
  | 2
  | Exception in thread "main" java.lang.ClassCastException: echo.B
  |         at at.ac.arsenal.Client.main(Client.java:53)
  | 

Only a "B" gets transmitted, although it should be a "C"

Now, to get the behavior I was talking about change the minOccurrs parameter of 
something element of BResponse to 0:


  |                         ..............
  |                     <xs:complexType name="BResponse">
  |                             <xs:sequence>
  |                                     <xs:element name="something" 
type="tns:Something" minOccurs="0" maxOccurs="1" nillable="true"/>
  |                                     <xs:element name="b" type="tns:B" 
minOccurs="1" maxOccurs="1" nillable="true"/>
  |                             </xs:sequence>
  |                     </xs:complexType>
  |                        ................
  | 

Then rerun wsconsume. The generated BResponse class now looks like this. Notice 
the JAXBElement type of variable something;


  | @XmlAccessorType(XmlAccessType.FIELD)
  | @XmlType(name = "BResponse", propOrder = {
  |     "something",
  |     "b"
  | })
  | public class BResponse {
  | 
  |     @XmlElementRef(name = "something", type = JAXBElement.class)
  |     protected JAXBElement<Something> something;
  |     @XmlElement(required = true, nillable = true)
  |     protected B b;
  | 

I Recompile and Redeploy the server then rerun the Client. The output is now: 


  | class echo.C
  | 1
  | 2
  | 3
  | 

now C gets transmitted and the arg2 property has the correct value.

As I said before this is of course no solution to the original problem, but I 
think it might be useful in tracking down the source of it.




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

Reply to the post : 
http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4056777
_______________________________________________
jboss-user mailing list
[email protected]
https://lists.jboss.org/mailman/listinfo/jboss-user

Reply via email to