Search code examples
javaweb-serviceswsdlweblogiccxf

CXF Webservice client breaks when providing wsdl


I've created a webservice client using cxf-codegen maven plugin and then instantiate the service like this:

    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setEndpointName(SERVICE_NAME);
    factory.setAddress("some address");
    factory.setServiceClass(Service.class);
    this.port = (Service) factory.create();

It all works fine and I can call the webservice. But I have a problem running this on Weblogic(XmlSchemaException: Top-level attributes may not have a 'use') and as a possible solution I'm trying to provide the WSDL file so that it's not regenerated. But when I add the wsdl:

factory.setWsdlLocation("service.wsdl");

I get this exception:

org.apache.cxf.service.factory.ServiceConstructionException: Could not find definition for port {namespace}Service.
    at org.apache.cxf.wsdl11.WSDLServiceFactory.create(WSDLServiceFactory.java:179)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.buildServiceFromWSDL(ReflectionServiceFactoryBean.java:428)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.initializeServiceModel(ReflectionServiceFactoryBean.java:548)
    at org.apache.cxf.service.factory.ReflectionServiceFactoryBean.create(ReflectionServiceFactoryBean.java:265)
    at org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean.create(JaxWsServiceFactoryBean.java:214)
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:101)
    at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:90)
    at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:155)
    at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:156)

I cannot modify the wsdl and I'd like to know how is it possible, that the service construction fails if I provide the wsdl the service was generated from.

I use CXF 2.6.11


Solution

  • You may need a factory.setServiceName(...) call in there as well to match the WSDL.