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

Dealing with empty soap:body together with MIME-Attachment in wsdl

Attach filesAttach ScreenshotAdd voteVotersWatch issueWatchersCreate sub-taskLinkCloneUpdate Comment AuthorReplace String in CommentUpdate Comment VisibilityDelete Comments
    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • 3.1.6
    • None
    • Soap Binding
    • None
    • Windows 7, Java 1.8_74

    • Unknown

    Description

      There are problems validating a wsdl and generating java-stubs from wsdl when the wsdl-file contains an empty soap:body-definition while data is put to MIME-Attachment.

      In a wsdl-file, i need to specify an empty soap:body, while the <message>-specific data needs to go to header and/ or attachment.
      As far as i know, an empty soap:body is defined with:
      <soap:body parts=""/>
      This construct is used in two cases in the following showcase in line 61 and line 71.

      showcase.wsdl
      <?xml version="1.0"?>
      
      <definitions name="Showcase"
                   targetNamespace="http://showcase.de/v1"
                   xmlns:tns="http://showcase.de/v1"
                   xmlns:xs="http://www.w3.org/2001/XMLSchema"
                   xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
                   xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
                   xmlns="http://schemas.xmlsoap.org/wsdl/">
      
         <documentation>
            Showcase
            demonstrate handling for empty soap:body together with attachments
         </documentation>
      
         <types>
            <schema targetNamespace="http://showcase.de/v1"
                    xmlns="http://www.w3.org/2001/XMLSchema"
                    elementFormDefault="qualified">
      
               <element name="DataTypeIn">
                  <complexType>
                     <sequence>
                        <any processContents="skip" />
                     </sequence>
                  </complexType>
               </element>
               <element name="DataTypeOut">
                  <complexType>
                     <sequence>
                        <any processContents="skip" />
                     </sequence>
                  </complexType>
               </element>
            </schema>
         </types>
      
         <message name="MyFuncReq">
            <part name="Version" type="xs:string" />
            <part name="DataReq" element="tns:DataTypeIn" />
         </message>
         <message name="MyFuncRsp">
            <part name="DataRsp" element="tns:DataTypeOut" />
         </message>
      
         <portType name="MyPort">
            <operation name="MyFunc">
               <input  message="tns:MyFuncReq" />
               <output message="tns:MyFuncRsp" />
            </operation>
         </portType>
      
         <binding name="MySoapBinding" type="tns:MyPort">
            <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
            <operation name="MyFunc">
               <soap:operation soapAction="MyFunc" />
               <input>
                  <mime:multipartRelated>
                     <mime:part>
                        <soap:header message="tns:MyFuncReq" part="Version" use="literal" />
                        <soap:body parts=""/>
                     </mime:part>
                     <mime:part>
                        <mime:content part="DataReq" type="text/xml" />
                     </mime:part>
                  </mime:multipartRelated>
               </input>
               <output>
                  <mime:multipartRelated>
                     <mime:part>
                        <soap:body parts=""/>
                     </mime:part>
                     <mime:part>
                        <mime:content part="DataRsp" type="text/xml" />
                     </mime:part>
                  </mime:multipartRelated>
               </output>
            </operation>
         </binding>
      
         <service name="MyService">
            <port name="MyHttpSoapPort" binding="tns:MySoapBinding">
               <soap:address location="http://host:port/services/func_1/" />
            </port>
         </service>
      
      </definitions>
      

      In the wsdl:input-definition (line 57ff.), the message-part "Version" is put into soap:header, as mentioned no part shall be put into soap:body and the "DataReq"-part is put into attachment.
      In the wsdl:output-definition (line 68ff.), again, nothing shall be put into soap:body while the "DataRsp"-part is put into attachment.

      Now, when i validate this wsdl-file using the command line:
      apache-cxf-3.1.6\bin\wsdlvalidator.bat showcase.wsdl
      i get multiple error messages, basically saying:
      cvc-minLength-valid: Value '' with length = '0' is not facet-valid with respect to minLength '1' for type 'NMTOKENS'.
      cvc-attribute.3: The value '' of attribute 'parts' on element 'soap:body' is not valid with respect to its type, 'NMTOKENS'

      As far as i understand these output, it is not allowed to define an empty "parts"-element, thus no empty soap:body.
      But why?

      Now when i generate java-stubs from this wsdl-file, using the command line:
      apache-cxf-3.1.6\bin\wsdl2java.bat" -verbose -d java_out showcase.wsdl
      the resulting files seem to be ok (generated interfaces and classes can be implemented/ extended) but during stub-generation i get the message:
      INFORMATION: Operation {http://showcase.de/v1}MyFunc cannot be unwrapped, input and output messages (if present) must contain only a single part
      which i don't know how to interpret. For me, it seems to be connected to the error-messages during validation.
      Can this be ignored? Is anything left out in the generated stubs?

      Interestingly i get no such messages when generating the java-stubs using the ant-task "com.sun.tools.ws.ant.WsImport" (having verbose=true).

      Any clarification is appreciated.

      Attachments

        Activity

          This comment will be Viewable by All Users Viewable by All Users
          Cancel

          People

            Unassigned Unassigned
            stefan1611 Stefan Laube

            Dates

              Created:
              Updated:

              Slack

                Issue deployment