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 <[email protected]>
> To: [email protected]
> Cc: Kevin McClusky <[email protected]>
> 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 <[email protected]>
> > To: [email protected]
> > Cc: Kevin McClusky <[email protected]>
> > 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
[email protected]
http://dankulp.com/blog
Talend - http://www.talend.com