You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Stefan Laube (JIRA)" <ji...@apache.org> on 2016/06/07 15:53:21 UTC

[jira] [Created] (CXF-6937) Dealing with empty soap:body together with MIME-Attachment in wsdl

Stefan Laube created CXF-6937:
---------------------------------

             Summary: Dealing with empty soap:body together with MIME-Attachment in wsdl
                 Key: CXF-6937
                 URL: https://issues.apache.org/jira/browse/CXF-6937
             Project: CXF
          Issue Type: Bug
    Affects Versions: 3.1.6
         Environment: Windows 7, Java 1.8_74
            Reporter: Stefan Laube
            Priority: Minor


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.

{code:title=showcase.wsdl|borderStyle=solid}
<?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>
{code}

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.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)