Uploaded image for project: 'CXF'
  1. CXF
  2. CXF-4676

Partial WSDL support in CXF

    XMLWordPrintableJSON

Details

    • Unknown

    Description

      I have one SEI defined as below:

      @WebService(wsdlLocation="WEB-INF/wsdl/AddNumbersImplPartial1Service.wsdl")
      public class AddNumbersImplPartial1 {

      public int addTwoNumbers(int number1, int number2) throws AddNegativeNumbersException {
      if (number1 < 0 || number2 < 0)

      { throw new AddNegativeNumbersException("Negative number submitted !! ", "Numbers: " + number1 + ", " + number2); }

      return number1 + number2;
      }
      }

      The WEB-INF/wsdl/AddNumbersImplPartial1Service.wsdl is not complete, it only contains to the porttype part:
      <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      <definitions
      targetNamespace="http://serverpartial1.partialwsdl.annotations/"
      name="AddNumbersImplPartial1Service"
      xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
      xmlns:xsd="http://www.w3.org/2001/XMLSchema"
      xmlns:tns="http://serverpartial1.partialwsdl.annotations/"
      xmlns="http://schemas.xmlsoap.org/wsdl/">
      <types>
      <xsd:schema>
      <xsd:import namespace="http://serverpartial1.partialwsdl.annotations/" schemaLocation="AddNumbersImplPartial1Service_schema1.xsd"/>
      </xsd:schema>
      </types>
      <message name="addTwoNumbers">
      <part name="parameters" element="tns:addTwoNumbers"/>
      </message>
      <message name="addTwoNumbersResponse">
      <part name="parameters" element="tns:addTwoNumbersResponse"/>
      </message>
      <message name="AddNegativeNumbersException">
      <part name="fault" element="tns:AddNegativeNumbersException"/>
      </message>
      <portType name="AddNumbersImplPartial1">
      <operation name="addTwoNumbers">
      <input message="tns:addTwoNumbers"/>
      <output message="tns:addTwoNumbersResponse"/>
      <fault name="AddNegativeNumbersException" message="tns:AddNegativeNumbersException"/>
      </operation>
      </portType>

      </definitions>

      Now if I put the war file into tomcat and let it use CXF, the service can not be deployed successfully. In CXF, when it calls WSDLServiceFactory.create, it will simply get the service name from wsdl file and in our case, since it is empty, it will throw exception and service deployment failed. you can reference below part:

      javax.wsdl.Service wsdlService = definition.getService(serviceName);
      if (wsdlService == null)

      { throw new ServiceConstructionException(new Message("NO_SUCH_SERVICE_EXC", LOG, serviceName)); }

      But per jaxws 2.2 spec, in chapter 5.2.5.5:

      5.2.5.5 Application-specified PortType
      No metadata document contains a definition for the sought-after service S, but a metadata document, say
      D, contains a definition for the WSDL portType whose qualified name, say P, matches that specified by the
      endpoint being published. In this case, a JAX-WS implementation MUST create a new description for S,
      including an appropriate WSDL binding element referencing portType P. The metadata document D MUST
      be imported/included so that the published contract uses the definition of P provided by D. No schema generation
      occurs,as P is assumed to embed or import schema definitions for all the types/elements it requires.
      Like in the previous case, the implementation MUST override any location and schemaLocation attributes.
      It is an error if more than one metadata document contains a definition for the sought-after portType
      P.

      Attachments

        1. cxf-4676.patch
          34 kB
          Iris Ding
        2. cxf-4676-test.patch
          13 kB
          Iris Ding

        Activity

          People

            ffang Freeman Yue Fang
            irisding Iris Ding
            Votes:
            0 Vote for this issue
            Watchers:
            4 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: