Hi Dan, Thanks for your response. To help answer point (1) below, I regenerated the Java artifacts from the WSDL again. This involved using the same WSDL as previously but this time, the targetNamespace was set correctly in the service endpoint interface and I was able to invoke the web service as expected. I have tried a number of times since then and could not reproduce the error. I'll keep trying to see if I can reproduce the problem and if so, will respond to this distribution list. Cheers, Euan
> Subject: Re: wsdl2java - @WebResult targetNamespace being generated as blank > From: [email protected] > Date: Thu, 26 Sep 2013 15:15:09 -0400 > To: [email protected]; [email protected] > > > 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 <[email protected]> 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 > [email protected] - http://dankulp.com/blog > Talend Community Coder - http://coders.talend.com >
