You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@cxf.apache.org by Kevin McClusky <ke...@yahoo.com> on 2011/04/16 05:33:59 UTC

Dynamic Client finding parameter classes for soap port

Hi,
   I have a WSDL that I'm trying to use with the Dynamic Client functionality of CXF.

   I've been through this page (and ComplexClient.java), and it works great if my wsdl is using type for message parts.

http://cxf.apache.org/docs/dynamic-clients.html  


   Unfortunately, the WSDL is using messages like this:

  <wsdl:message name="FillTankSoapIn">    
    <wsdl:part name="parameters" element="tns:FillTank" />  
  </wsdl:message> 

   I've been able to get the element QName with MessagePartInfo.getElementQName(), and I can see that the classes for the element are being generated, but I'm not sure how to go from the QName to the generated Class.  


(It appears there's no .getElementClass(), but I could just be missing something.)


   Any help would be greatly appreciated.  I've been banging my head on the keyboard for a while now :)

Thanks,
Kevin

Re: Dynamic Client finding parameter classes for soap port

Posted by Kevin McClusky <ke...@yahoo.com>.
That change works great, and does exactly what I need.  Thank you so much!



________________________________
From: Daniel Kulp <dk...@apache.org>
To: users@cxf.apache.org
Cc: Kevin McClusky <ke...@yahoo.com>
Sent: Tuesday, April 19, 2011 12:10 PM
Subject: Re: Dynamic Client finding parameter classes for soap port


I'm not completely sure what's happening yet or why, but there is certainly an 
easy fix.   Change:

        DynamicClientFactory dcf = DynamicClientFactory.newInstance();

to 

        DynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

The JAXWS subclass is much more capable as it can handle more of the complex 
use cases with headers and inouts and such.    

Dan


On Monday 18 April 2011 5:58:31 PM Kevin McClusky wrote:
> It looks like isUnwrapped() is false, so no dice on trying what you
> suggested. Here's a simple test case I threw together.  It's using a
> publicly available WSDL, found here:
> 
> 
> http://www.webservicex.net/stockquote.asmx?WSDL
> 
> 
> import javax.xml.namespace.QName;
> 
> import org.apache.cxf.endpoint.Client;
> import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
> import org.apache.cxf.service.model.MessagePartInfo;
> 
> public class SimpleTest {
> 
>     public static void main(String[] args) {
>         // WebserviceX Stock Quote
>         String wsdlUrl = "http://www.webservicex.net/stockquote.asmx?WSDL";
>         QName service = new
> QName("http://www.webserviceX.NET/","StockQuote"); // SOAP port, doesn't
> have a type class
>         QName port = new
> QName("http://www.webserviceX.NET/","StockQuoteSoap12"); // POST port, has
> a type class
>         //QName port = new
> QName("http://www.webserviceX.NET/","StockQuoteHttpPost"); 
>         // Generate the SOAP client
>         DynamicClientFactory dcf = DynamicClientFactory.newInstance();
>         Client client = dcf.createClient(wsdlUrl, service,
> DynamicClientFactory.class.getClassLoader(), port); 
>         // Read and print the messagePartInfo
>         MessagePartInfo messagePartInfo =
> client.getEndpoint().getBinding().getBindingInfo().getOperations().iterato
> r().next().getInput().getMessageParts().get(0); printInfo(messagePartInfo);
>        
> 
>     }
>    
>     public static void printInfo(MessagePartInfo messagePartInfo) {
>         System.out.println("Message Part Name:
> "+messagePartInfo.getName()); System.out.println(" Type Name:  
> "+messagePartInfo.getTypeQName()); System.out.println(" Type Class:  
> "+messagePartInfo.getTypeClass()); System.out.println(" Element Name:
> "+messagePartInfo.getElementQName()); System.out.println("");
>     }
> 
> }
> 
> 
> The output when using the SOAP port above:
> 
> Message Part Name: {http://www.webserviceX.NET/}parameters
>  Type Name:    null
>  Type Class:   null
>  Element Name: {http://www.webserviceX.NET/}GetQuote
> 
> 
> And when using POST:
> 
> Message Part Name: {http://www.webserviceX.NET/}symbol
>  Type Name:    {http://www.w3.org/2001/XMLSchema}string
>  Type Class:   class java.lang.String
>  Element Name: null
> 
> 
> 
> 
> 
> ________________________________
> From: Daniel Kulp <dk...@apache.org>
> To: users@cxf.apache.org
> Cc: Kevin McClusky <ke...@yahoo.com>
> Sent: Monday, April 18, 2011 1:30 PM
> Subject: Re: Dynamic Client finding parameter classes for soap port
> 
> On Monday 18 April 2011 4:22:18 PM Kevin McClusky wrote:
> > getTypeClass is actually giving me a null on any MessageParts that don't
> > have a type=
> 
> Strange.  That definitely should work fine as the class should be in
> there.  On the operation, can you try calling isUnwrapped and if true,
> casting it to the UnwrappedOperationInfo and try the message parts on the
> result of getWrappedOperation?
> 
> If that still doesn't help, we'd likely need to see a test case.   I'm
> really not sure why those classes are being set in there.
> 
> Dan
> 
> > -Kevin
> > 
> > 
> > 
> > ________________________________
> > From: Daniel Kulp <dk...@apache.org>
> > To: users@cxf.apache.org
> > Cc: Kevin McClusky <ke...@yahoo.com>
> > Sent: Monday, April 18, 2011 1:00 PM
> > Subject: Re: Dynamic Client finding parameter classes for soap port
> > 
> > 
> > This all should work fine.    The getTypeClass should also be used in
> > this case and should return the required generated type for that
> > element.
> > 
> > Dan
> > 
> > On Friday 15 April 2011 11:33:59 PM Kevin McClusky wrote:
> > > Hi,
> > >
> > >    I have a WSDL that I'm trying to use with the Dynamic Client
> > >
> > > functionality of CXF.
> > >
> > >    I've been through this page (and ComplexClient.java), and it works
> > >great
> > >
> > > if my wsdl is using type for message parts.
> > > 
> > > http://cxf.apache.org/docs/dynamic-clients.html
> > >
> > >    Unfortunately, the WSDL is using messages like this:
> > >
> > >   <wsdl:message name="FillTankSoapIn">
> > >     <wsdl:part name="parameters" element="tns:FillTank" />
> > >   </wsdl:message>
> > >
> > >    I've been able to get the element QName with
> > >
> > > MessagePartInfo.getElementQName(), and I can see that the classes for
> > > the element are being generated, but I'm not sure how to go from the
> > > QName to the generated Class.
> > > 
> > > 
> > > (It appears there's no .getElementClass(), but I could just be missing
> > > something.)
> > >
> > >    Any help would be greatly appreciated.  I've been banging my head on
> > >the
> > >
> > > keyboard for a while now :)
> > > 
> > > Thanks,
> > > Kevin

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com

Re: Dynamic Client finding parameter classes for soap port

Posted by Daniel Kulp <dk...@apache.org>.
I'm not completely sure what's happening yet or why, but there is certainly an 
easy fix.   Change:

        DynamicClientFactory dcf = DynamicClientFactory.newInstance();

to 

        DynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();

The JAXWS subclass is much more capable as it can handle more of the complex 
use cases with headers and inouts and such.    

Dan


On Monday 18 April 2011 5:58:31 PM Kevin McClusky wrote:
> It looks like isUnwrapped() is false, so no dice on trying what you
> suggested. Here's a simple test case I threw together.  It's using a
> publicly available WSDL, found here:
> 
> 
> http://www.webservicex.net/stockquote.asmx?WSDL
> 
> 
> import javax.xml.namespace.QName;
> 
> import org.apache.cxf.endpoint.Client;
> import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
> import org.apache.cxf.service.model.MessagePartInfo;
> 
> public class SimpleTest {
> 
>     public static void main(String[] args) {
>         // WebserviceX Stock Quote
>         String wsdlUrl = "http://www.webservicex.net/stockquote.asmx?WSDL";
>         QName service = new
> QName("http://www.webserviceX.NET/","StockQuote"); // SOAP port, doesn't
> have a type class
>         QName port = new
> QName("http://www.webserviceX.NET/","StockQuoteSoap12"); // POST port, has
> a type class
>         //QName port = new
> QName("http://www.webserviceX.NET/","StockQuoteHttpPost"); 
>         // Generate the SOAP client
>         DynamicClientFactory dcf = DynamicClientFactory.newInstance();
>         Client client = dcf.createClient(wsdlUrl, service,
> DynamicClientFactory.class.getClassLoader(), port); 
>         // Read and print the messagePartInfo
>         MessagePartInfo messagePartInfo =
> client.getEndpoint().getBinding().getBindingInfo().getOperations().iterato
> r().next().getInput().getMessageParts().get(0); printInfo(messagePartInfo);
>        
> 
>     }
>    
>     public static void printInfo(MessagePartInfo messagePartInfo) {
>         System.out.println("Message Part Name:
> "+messagePartInfo.getName()); System.out.println(" Type Name:   
> "+messagePartInfo.getTypeQName()); System.out.println(" Type Class:  
> "+messagePartInfo.getTypeClass()); System.out.println(" Element Name:
> "+messagePartInfo.getElementQName()); System.out.println("");
>     }
> 
> }
> 
> 
> The output when using the SOAP port above:
> 
> Message Part Name: {http://www.webserviceX.NET/}parameters
>  Type Name:    null
>  Type Class:   null
>  Element Name: {http://www.webserviceX.NET/}GetQuote
> 
> 
> And when using POST:
> 
> Message Part Name: {http://www.webserviceX.NET/}symbol
>  Type Name:    {http://www.w3.org/2001/XMLSchema}string
>  Type Class:   class java.lang.String
>  Element Name: null
> 
> 
> 
> 
> 
> ________________________________
> From: Daniel Kulp <dk...@apache.org>
> To: users@cxf.apache.org
> Cc: Kevin McClusky <ke...@yahoo.com>
> Sent: Monday, April 18, 2011 1:30 PM
> Subject: Re: Dynamic Client finding parameter classes for soap port
> 
> On Monday 18 April 2011 4:22:18 PM Kevin McClusky wrote:
> > getTypeClass is actually giving me a null on any MessageParts that don't
> > have a type=
> 
> Strange.  That definitely should work fine as the class should be in
> there.  On the operation, can you try calling isUnwrapped and if true,
> casting it to the UnwrappedOperationInfo and try the message parts on the
> result of getWrappedOperation?
> 
> If that still doesn't help, we'd likely need to see a test case.   I'm
> really not sure why those classes are being set in there.
> 
> Dan
> 
> > -Kevin
> > 
> > 
> > 
> > ________________________________
> > From: Daniel Kulp <dk...@apache.org>
> > To: users@cxf.apache.org
> > Cc: Kevin McClusky <ke...@yahoo.com>
> > Sent: Monday, April 18, 2011 1:00 PM
> > Subject: Re: Dynamic Client finding parameter classes for soap port
> > 
> > 
> > This all should work fine.    The getTypeClass should also be used in
> > this case and should return the required generated type for that
> > element.
> > 
> > Dan
> > 
> > On Friday 15 April 2011 11:33:59 PM Kevin McClusky wrote:
> > > Hi,
> > >
> > >    I have a WSDL that I'm trying to use with the Dynamic Client
> > >
> > > functionality of CXF.
> > >
> > >    I've been through this page (and ComplexClient.java), and it works
> > >great
> > >
> > > if my wsdl is using type for message parts.
> > > 
> > > http://cxf.apache.org/docs/dynamic-clients.html
> > >
> > >    Unfortunately, the WSDL is using messages like this:
> > >
> > >   <wsdl:message name="FillTankSoapIn">
> > >     <wsdl:part name="parameters" element="tns:FillTank" />
> > >   </wsdl:message>
> > >
> > >    I've been able to get the element QName with
> > >
> > > MessagePartInfo.getElementQName(), and I can see that the classes for
> > > the element are being generated, but I'm not sure how to go from the
> > > QName to the generated Class.
> > > 
> > > 
> > > (It appears there's no .getElementClass(), but I could just be missing
> > > something.)
> > >
> > >    Any help would be greatly appreciated.  I've been banging my head on
> > >the
> > >
> > > keyboard for a while now :)
> > > 
> > > Thanks,
> > > Kevin

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com

Re: Dynamic Client finding parameter classes for soap port

Posted by Kevin McClusky <ke...@yahoo.com>.
It looks like isUnwrapped() is false, so no dice on trying what you suggested.
Here's a simple test case I threw together.  It's using a publicly available WSDL, found here: 


http://www.webservicex.net/stockquote.asmx?WSDL


import javax.xml.namespace.QName;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.dynamic.DynamicClientFactory;
import org.apache.cxf.service.model.MessagePartInfo;

public class SimpleTest {

    public static void main(String[] args) {
        // WebserviceX Stock Quote
        String wsdlUrl = "http://www.webservicex.net/stockquote.asmx?WSDL";
        QName service = new QName("http://www.webserviceX.NET/","StockQuote");
        // SOAP port, doesn't have a type class
        QName port = new QName("http://www.webserviceX.NET/","StockQuoteSoap12");
        // POST port, has a type class
        //QName port = new QName("http://www.webserviceX.NET/","StockQuoteHttpPost");
        
        // Generate the SOAP client
        DynamicClientFactory dcf = DynamicClientFactory.newInstance();
        Client client = dcf.createClient(wsdlUrl, service, DynamicClientFactory.class.getClassLoader(), port);
        
        // Read and print the messagePartInfo
        MessagePartInfo messagePartInfo = client.getEndpoint().getBinding().getBindingInfo().getOperations().iterator().next().getInput().getMessageParts().get(0); 
        printInfo(messagePartInfo);
        

    }
    
    public static void printInfo(MessagePartInfo messagePartInfo) {
        System.out.println("Message Part Name: "+messagePartInfo.getName());
        System.out.println(" Type Name:    "+messagePartInfo.getTypeQName());
        System.out.println(" Type Class:   "+messagePartInfo.getTypeClass());
        System.out.println(" Element Name: "+messagePartInfo.getElementQName());
        System.out.println("");
    }

}


The output when using the SOAP port above:

Message Part Name: {http://www.webserviceX.NET/}parameters
 Type Name:    null
 Type Class:   null
 Element Name: {http://www.webserviceX.NET/}GetQuote


And when using POST:

Message Part Name: {http://www.webserviceX.NET/}symbol
 Type Name:    {http://www.w3.org/2001/XMLSchema}string
 Type Class:   class java.lang.String
 Element Name: null





________________________________
From: Daniel Kulp <dk...@apache.org>
To: users@cxf.apache.org
Cc: Kevin McClusky <ke...@yahoo.com>
Sent: Monday, April 18, 2011 1:30 PM
Subject: Re: Dynamic Client finding parameter classes for soap port

On Monday 18 April 2011 4:22:18 PM Kevin McClusky wrote:
> getTypeClass is actually giving me a null on any MessageParts that don't
> have a type=

Strange.  That definitely should work fine as the class should be in there.  
On the operation, can you try calling isUnwrapped and if true, casting it to 
the UnwrappedOperationInfo and try the message parts on the result of 
getWrappedOperation?

If that still doesn't help, we'd likely need to see a test case.   I'm really 
not sure why those classes are being set in there.

Dan




> 
> 
> -Kevin
> 
> 
> 
> ________________________________
> From: Daniel Kulp <dk...@apache.org>
> To: users@cxf.apache.org
> Cc: Kevin McClusky <ke...@yahoo.com>
> Sent: Monday, April 18, 2011 1:00 PM
> Subject: Re: Dynamic Client finding parameter classes for soap port
> 
> 
> This all should work fine.    The getTypeClass should also be used in this
> case and should return the required generated type for that element.
> 
> Dan
> 
> On Friday 15 April 2011 11:33:59 PM Kevin McClusky wrote:
> > Hi,
> >
> >    I have a WSDL that I'm trying to use with the Dynamic Client
> >
> > functionality of CXF.
> >
> >    I've been through this page (and ComplexClient.java), and it works
> >great
> >
> > if my wsdl is using type for message parts.
> > 
> > http://cxf.apache.org/docs/dynamic-clients.html
> >
> >    Unfortunately, the WSDL is using messages like this:
> >
> >   <wsdl:message name="FillTankSoapIn"> 
> >     <wsdl:part name="parameters" element="tns:FillTank" />
> >   </wsdl:message>
> >
> >    I've been able to get the element QName with
> >
> > MessagePartInfo.getElementQName(), and I can see that the classes for the
> > element are being generated, but I'm not sure how to go from the QName to
> > the generated Class.
> > 
> > 
> > (It appears there's no .getElementClass(), but I could just be missing
> > something.)
> >
> >    Any help would be greatly appreciated.  I've been banging my head on
> >the
> >
> > keyboard for a while now :)
> > 
> > Thanks,
> > Kevin

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com

Re: Dynamic Client finding parameter classes for soap port

Posted by Daniel Kulp <dk...@apache.org>.
On Monday 18 April 2011 4:22:18 PM Kevin McClusky wrote:
> getTypeClass is actually giving me a null on any MessageParts that don't
> have a type=

Strange.  That definitely should work fine as the class should be in there.   
On the operation, can you try calling isUnwrapped and if true, casting it to 
the UnwrappedOperationInfo and try the message parts on the result of 
getWrappedOperation?

If that still doesn't help, we'd likely need to see a test case.   I'm really 
not sure why those classes are being set in there.

Dan




> 
> 
> -Kevin
> 
> 
> 
> ________________________________
> From: Daniel Kulp <dk...@apache.org>
> To: users@cxf.apache.org
> Cc: Kevin McClusky <ke...@yahoo.com>
> Sent: Monday, April 18, 2011 1:00 PM
> Subject: Re: Dynamic Client finding parameter classes for soap port
> 
> 
> This all should work fine.    The getTypeClass should also be used in this
> case and should return the required generated type for that element.
> 
> Dan
> 
> On Friday 15 April 2011 11:33:59 PM Kevin McClusky wrote:
> > Hi,
> >
> >    I have a WSDL that I'm trying to use with the Dynamic Client
> >
> > functionality of CXF.
> >
> >    I've been through this page (and ComplexClient.java), and it works
> >great
> >
> > if my wsdl is using type for message parts.
> > 
> > http://cxf.apache.org/docs/dynamic-clients.html
> >
> >    Unfortunately, the WSDL is using messages like this:
> >
> >   <wsdl:message name="FillTankSoapIn"> 
> >     <wsdl:part name="parameters" element="tns:FillTank" />
> >   </wsdl:message>
> >
> >    I've been able to get the element QName with
> >
> > MessagePartInfo.getElementQName(), and I can see that the classes for the
> > element are being generated, but I'm not sure how to go from the QName to
> > the generated Class.
> > 
> > 
> > (It appears there's no .getElementClass(), but I could just be missing
> > something.)
> >
> >    Any help would be greatly appreciated.  I've been banging my head on
> >the
> >
> > keyboard for a while now :)
> > 
> > Thanks,
> > Kevin

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com

Re: Dynamic Client finding parameter classes for soap port

Posted by Kevin McClusky <ke...@yahoo.com>.
getTypeClass is actually giving me a null on any MessageParts that don't have a type= 


-Kevin



________________________________
From: Daniel Kulp <dk...@apache.org>
To: users@cxf.apache.org
Cc: Kevin McClusky <ke...@yahoo.com>
Sent: Monday, April 18, 2011 1:00 PM
Subject: Re: Dynamic Client finding parameter classes for soap port


This all should work fine.    The getTypeClass should also be used in this 
case and should return the required generated type for that element.

Dan


On Friday 15 April 2011 11:33:59 PM Kevin McClusky wrote:
> Hi,
>    I have a WSDL that I'm trying to use with the Dynamic Client
> functionality of CXF.
> 
>    I've been through this page (and ComplexClient.java), and it works great
> if my wsdl is using type for message parts.
> 
> http://cxf.apache.org/docs/dynamic-clients.html 
> 
> 
>    Unfortunately, the WSDL is using messages like this:
> 
>   <wsdl:message name="FillTankSoapIn">  
>     <wsdl:part name="parameters" element="tns:FillTank" /> 
>   </wsdl:message> 
> 
>    I've been able to get the element QName with
> MessagePartInfo.getElementQName(), and I can see that the classes for the
> element are being generated, but I'm not sure how to go from the QName to
> the generated Class. 
> 
> 
> (It appears there's no .getElementClass(), but I could just be missing
> something.)
> 
> 
>    Any help would be greatly appreciated.  I've been banging my head on the
> keyboard for a while now :)
> 
> Thanks,
> Kevin

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com

Re: Dynamic Client finding parameter classes for soap port

Posted by Daniel Kulp <dk...@apache.org>.
This all should work fine.    The getTypeClass should also be used in this 
case and should return the required generated type for that element.

Dan


On Friday 15 April 2011 11:33:59 PM Kevin McClusky wrote:
> Hi,
>    I have a WSDL that I'm trying to use with the Dynamic Client
> functionality of CXF.
> 
>    I've been through this page (and ComplexClient.java), and it works great
> if my wsdl is using type for message parts.
> 
> http://cxf.apache.org/docs/dynamic-clients.html 
> 
> 
>    Unfortunately, the WSDL is using messages like this:
> 
>   <wsdl:message name="FillTankSoapIn">   
>     <wsdl:part name="parameters" element="tns:FillTank" /> 
>   </wsdl:message> 
> 
>    I've been able to get the element QName with
> MessagePartInfo.getElementQName(), and I can see that the classes for the
> element are being generated, but I'm not sure how to go from the QName to
> the generated Class. 
> 
> 
> (It appears there's no .getElementClass(), but I could just be missing
> something.)
> 
> 
>    Any help would be greatly appreciated.  I've been banging my head on the
> keyboard for a while now :)
> 
> Thanks,
> Kevin

-- 
Daniel Kulp
dkulp@apache.org
http://dankulp.com/blog
Talend - http://www.talend.com

Re: Dynamic Client finding parameter classes for soap port

Posted by Kevin McClusky <ke...@yahoo.com>.
Anyone?  I just need to get a java Class from an element= instead of a type=

Thanks,
Kevin



________________________________
From: Kevin McClusky <ke...@yahoo.com>
To: "users@cxf.apache.org" <us...@cxf.apache.org>
Sent: Friday, April 15, 2011 8:33 PM
Subject: Dynamic Client finding parameter classes for soap port

Hi,
   I have a WSDL that I'm trying to use with the Dynamic Client functionality of CXF.

   I've been through this page (and ComplexClient.java), and it works great if my wsdl is using type for message parts.

http://cxf.apache.org/docs/dynamic-clients.html  


   Unfortunately, the WSDL is using messages like this:

  <wsdl:message name="FillTankSoapIn">    
    <wsdl:part name="parameters" element="tns:FillTank" />  
  </wsdl:message> 

   I've been able to get the element QName with MessagePartInfo.getElementQName(), and I can see that the classes for the element are being generated, but I'm not sure how to go from the QName to the generated Class.  


(It appears there's no .getElementClass(), but I could just be missing something.)


   Any help would be greatly appreciated.  I've been banging my head on the keyboard for a while now :)

Thanks,
Kevin