Java 如何防止SOAP wsdl中的命名空间包装器标记?

Java 如何防止SOAP wsdl中的命名空间包装器标记?,java,web-services,soap,wsdl,cxf,Java,Web Services,Soap,Wsdl,Cxf,我用cxf创建了一个wsdlwebservice 问题:我的请求和响应都包含一个带有名称空间的额外包装器元素 问题:是否可以阻止此包装器元素?因为对我来说,它没有任何价值,只是其他人使用我的Web服务时的一个附加元素 例如,我想将下面示例中的层次结构简化为一个元素,而不是两个嵌套元素 @WebService(name = "myname", serviceName = "myname", targetNamespace = "com.test") publi class MySoapServle

我用
cxf
创建了一个
wsdl
webservice

问题:我的请求和响应都包含一个带有名称空间的额外包装器元素

问题:是否可以阻止此包装器元素?因为对我来说,它没有任何价值,只是其他人使用我的Web服务时的一个附加元素

例如,我想将下面示例中的
层次结构简化为一个元素,而不是两个嵌套元素

@WebService(name = "myname", serviceName = "myname", targetNamespace = "com.test")
publi class MySoapServlet {
    @WebMethod(operationName = "MyNameOperation")   
    @WebResult(name = "MyNameResult")
    public MyResponse getRsp(@WebParam(name = "MyNameReq") MyNameReq req) {
        //return...
    }
}

@XmlRootElement(name = "MyNameResponse")
@XmlAccessorType(XmlAccessType.FIELD)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class MyNameResponse {
    private String name;
}
生成的wsdl结构:

请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:de="com.test">
   <soapenv:Header/>
   <soapenv:Body>
      <!-- how can I omit this namespace element completely? -->
      <com:MyNameOperation>
         <MyNameReq>
            ...
         </MyNameReq>
      </com:MyNameOperation>
   </soapenv:Body>
</soapenv:Envelope>

...
答复:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <!-- how can I omit this namespace element completely? -->
      <ns2:MyNameResponse xmlns:ns2="com.test">
        <MyNameResult>
          <name>somevalue</name>
        </MyNameResult>
      </ns2:MyNameResponse>
   </soapenv:Body>
</soapenv:Envelope>

一些价值

您可以使用parameterstyle BARE
@SOAPBinding(parameterstyle=parameterstyle.BARE)
。但是,您不能完全删除这两个级别,因为标识操作需要操作名称。更新后的类如下图所示

@WebService(name = "myname", serviceName = "myname", targetNamespace = "com.test")
@SOAPBinding(parameterStyle=ParameterStyle.BARE)
publi class MySoapServlet {
    @WebMethod(operationName = "MyNameOperation")   
    @WebResult(name = "MyNameResult")
    public MyResponse getRsp(@WebParam(name = "MyNameReq") MyNameReq req) {
        //return...
    }
}
更新后的请求xml将为

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:de="com.test">
   <soapenv:Header/>
   <soapenv:Body>
         <com:MyNameReq>
            <name >data</name>
         </com:MyNameReq>
   </soapenv:Body>
</soapenv:Envelope>

数据
对此的反应是

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <!-- how can I omit this namespace element completely? -->
      <ns2:MyNameResult xmlns:ns2="com.test">
          <name>somevalue</name>
      </ns2:MyNameResult>
   </soapenv:Body>
</soapenv:Envelope>

一些价值

您可以使用parameterstyle BARE
@SOAPBinding(parameterstyle=parameterstyle.BARE)
。但是,您不能完全删除这两个级别,因为标识操作需要操作名称。更新后的类如下图所示

@WebService(name = "myname", serviceName = "myname", targetNamespace = "com.test")
@SOAPBinding(parameterStyle=ParameterStyle.BARE)
publi class MySoapServlet {
    @WebMethod(operationName = "MyNameOperation")   
    @WebResult(name = "MyNameResult")
    public MyResponse getRsp(@WebParam(name = "MyNameReq") MyNameReq req) {
        //return...
    }
}
更新后的请求xml将为

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:de="com.test">
   <soapenv:Header/>
   <soapenv:Body>
         <com:MyNameReq>
            <name >data</name>
         </com:MyNameReq>
   </soapenv:Body>
</soapenv:Envelope>

数据
对此的反应是

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <!-- how can I omit this namespace element completely? -->
      <ns2:MyNameResult xmlns:ns2="com.test">
          <name>somevalue</name>
      </ns2:MyNameResult>
   </soapenv:Body>
</soapenv:Envelope>

一些价值