cxf-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel Kulp <dk...@apache.org>
Subject Re: wsdl2java - @WebResult targetNamespace being generated as blank
Date Thu, 26 Sep 2013 19:15:09 GMT

Couple thoughts:

1) A full example would be useful.   I'd like to see if wsimport would generate the same thing.

2) Can you also try using CXF for the JAX-WS runtime?  You're using the JDK internal JAX-WS
implementation.  I saw a similar  bug just yesterday in the internal jaxws impl that worked
fine with CXF.

Dan



On Sep 26, 2013, at 12:18 PM, Euan Milton <euanmilton@hotmail.co.uk> wrote:

> Hi,
> We have an application which needs to consume an external web service. To do this we
have generated the set of Java artifacts from the WSDL via Maven using the wsdl2java goal
provided by the cxf-codegen-plugin plugin.
> In the application we want to set the endpoint to use for the web service call at runtime
(to cater for different web service endpoint URLs in test environments) and so have written
some code as follows to do this for us:
> private <T> T createServiceObject(final Class<T> p_seiClass) throws MalformedURLException
{
>        final Service serviceFactory = Service.create(new URL(wsdlLocation), new QName(targetNamespace,
serviceName));        final T service = serviceFactory.getPort(p_seiClass);        ((BindingProvider)
service).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "endpoint");
>        return service;    }
> 
> When the code runs it fails on the serviceFactory.getPort line with the following exception:
> javax.xml.ws.WebServiceException: class ZZZ.YYYwebservice.v5.types.ProcessUIRequestResponse
do not have a property of the name ProcessUIRequestResult    at com.sun.xml.internal.ws.client.sei.ResponseBuilder$DocLit.<init>(ResponseBuilder.java:512)
   at com.sun.xml.internal.ws.client.sei.SEIMethodHandler.buildResponseBuilder(SEIMethodHandler.java:172)
   at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.<init>(SyncMethodHandler.java:86)
   at com.sun.xml.internal.ws.client.sei.SEIStub.<init>(SEIStub.java:83)    at com.sun.xml.internal.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(WSServiceDelegate.java:641)
   at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:344)
   at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:326)
   at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:364)
   at com.sun.xml.internal.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:368)
   at javax.xml.ws.Service.getPort(Service.java:172)    at com.XXX.XXX.XXX.YYY.integration.facade.jaxws.ProcessUIRequestFacadeJaxws.createServiceObject(ProcessUIRequestFacadeJaxws.java:53)
   at com.XXX.XXX.XXX.YYY.integration.facade.jaxws.ProcessUIRequestFacadeJaxws.processUIRequest(ProcessUIRequestFacadeJaxws.java:39)
   at com.XXX.XXX.XXX.YYY.integration.facade.jaxws.ProcessUIRequestFacadeJaxwsTest.test(ProcessUIRequestFacadeJaxwsTest.java:49)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:60)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
   at java.lang.reflect.Method.invoke(Method.java:611)    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
   at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
   at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
  at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)   
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
   at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)  
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
   at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
   at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
   at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
   at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
   at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)    at
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
   at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)Caused
by: javax.xml.bind.JAXBException: ProcessUIRequestResult is not a valid property on class
ZZZ.YYYwebservice.v5.types.ProcessUIRequestResponse    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getElementPropertyAccessor(JAXBContextImpl.java:954)
   at com.sun.xml.internal.ws.client.sei.ResponseBuilder$DocLit.<init>(ResponseBuilder.java:501)
   ... 37 more
> At the bottom I can see javax.xml.bind.JAXBException: ProcessUIRequestResult is not a
valid property on class ZZZ.YYYwebservice.v5.types.ProcessUIRequestResponse which suggests
that something is wrong with the generated ProcessUIRequestResponse.java file.
> I looked at that file and can't see anything obvious (ProcessUIRequestResult is defined
in the class and has a getter and setter).
> So, my investigation progressed further to look at the SEI that was generated:
> /** * This class was generated by Apache CXF 2.5.2 2013-09-26T13:05:17.389+01:00 Generated
source version: 2.5.2 *  */@WebService(targetNamespace = "http://zzz/yyywebservice/v5/types/",
name = "Types")@XmlSeeAlso({ zzz.yyyentityview.ObjectFactory.class, zzz.yyyview.search.postcode.ObjectFactory.class,
       zzz.yyyentityview.validation.ObjectFactory.class, zzz.serializable_dictionary.ObjectFactory.class,
       zzz.yyyview.search.app.ObjectFactory.class, zzz.yyybase.ObjectFactory.class, zzz.yyybase.enums.ObjectFactory.class,
       zzz.yyyview.uw.ObjectFactory.class, zzz.yyyview.app.ObjectFactory.class, zzz.yyyview.search.bank.ObjectFactory.class,
       zzz.yyyview.search.list.ObjectFactory.class, zzz.yyyentityview.app.ObjectFactory.class,
       zzz.yyyentityview.client.ObjectFactory.class, ObjectFactory.class })public interface
Types {
>    @WebResult(name = "ProcessUIRequestResult", targetNamespace = "")    @ResponseWrapper(localName
= "ProcessUIRequestResponse", targetNamespace = "http://zzz/yyywebservice/v5/types/", className
= "zzz.yyywebservice.v5.types.ProcessUIRequestResponse")    @RequestWrapper(localName = "ProcessUIRequest",
targetNamespace = "http://zzz/yyywebservice/v5/types/", className = "zzz.yyywebservice.v5.types.ProcessUIRequest")
   @WebMethod(operationName = "ProcessUIRequest", action = "http://zzz/yyywebservice/v5/ProcessUIRequest")
   public zzz.yyybase.BaseVO processUIRequest(            @WebParam(name = "ProcessUIRequest",
targetNamespace = "http://zzz/yyywebservice/v5/types/") zzz.yyybase.BaseVO processUIRequest);
>    @WebResult(name = "GetActivityStatusEntityResult", targetNamespace = "")    @ResponseWrapper(localName
= "GetActivityStatusEntityResponse", targetNamespace = "http://zzz/yyywebservice/v5/types/",
className = "zzz.yyywebservice.v5.types.GetActivityStatusEntityResponse")    @RequestWrapper(localName
= "GetActivityStatusEntity", targetNamespace = "http://zzz/yyywebservice/v5/types/", className
= "zzz.yyywebservice.v5.types.GetActivityStatusEntity")    @WebMethod(operationName = "GetActivityStatusEntity",
action = "http://zzz/yyywebservice/v5/GetActivityStatusEntity")    public zzz.yyybase.ActivityStatusVOBase
getActivityStatusEntity(            @WebParam(name = "ProcessUIRequest", targetNamespace =
"http://zzz/yyywebservice/v5/types/") zzz.yyybase.BaseVO processUIRequest);}
> You can see that the targetNamespace of the @WebResult annotation is blank.  When I manually
edit the class and add what I would expect the targetNamespace to be (based on looking in
the XSDs), I can sucessfully invoke the web service.
> Having done some research into what the @WebResult tag represents, it is related to the
wsdl:part definition.  Tracing through the WSDL and XSD definitions from wsdl:port which is
defined as follows (in one of the WSDL files):
> <wsdl:message name="ProcessUIRequestSoapIn">    <wsdl:part name="parameters"
element="tns:ProcessUIRequest"/>  </wsdl:message>  <wsdl:message name="ProcessUIRequestSoapOut">
   <wsdl:part name="parameters" element="tns:ProcessUIRequestResponse"/>  </wsdl:message>
> This WSDL has the tns and targetNamespace defined as "http://zzz/yyywebservice/v5/types/"
(which is what I add to the @WebResult to get the call working).
> The definitions of ProcessUIRequest and ProcessUIRequestResponse are found in an included
schema as follows:
> <xs:element name="ProcessUIRequest">    <xs:complexType>      <xs:sequence>
       <xs:element minOccurs="0" maxOccurs="1" name="ProcessUIRequest" type="q1:BaseVO"
xmlns:q1="http://tcp/ssgbase/"/>      </xs:sequence>    </xs:complexType> 
</xs:element>  <xs:element name="ProcessUIRequestResponse">    <xs:complexType>
     <xs:sequence>        <xs:element minOccurs="0" maxOccurs="1" name="ProcessUIRequestResult"
type="q2:BaseVO" xmlns:q2="http://tcp/ssgbase/"/>      </xs:sequence>    </xs:complexType>
 </xs:element>
> This schema also has the the tns and targetNamespace defined as "http://zzz/yyywebservice/v5/types/"
.
> From what I can see, everything in the WSDL and XSD definitions look fine and I'm now
at a bit of a dead end.  Does anyone have pointers for where I can look next?
> Regards,
> Euan
> 
> 
> 
> 
> 		 	   		  

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


Mime
View raw message