如何防止 SOAP wsdl 中的名称空间包装器标记?
How to prevent namespace wrapper tags in SOAP wsdl?
我用 cxf
创建了一个 wsdl
网络服务。
问题:我的请求和响应都包含一个带有命名空间的额外包装器元素。
问题:是否可以阻止这个包装元素?因为对我来说它没有增加任何价值,只是当其他人使用我的网络服务时的一个附加元素。
例如,我想将以下示例中的 <com:MyNameOperation><MyNameReq>
层次结构减少为一个元素,而不是两个嵌套元素。
@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)
。但是,您不能完全删除这 2 个级别,因为需要操作名称来标识操作。更新后的 class 如下所示
@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>
我用 cxf
创建了一个 wsdl
网络服务。
问题:我的请求和响应都包含一个带有命名空间的额外包装器元素。
问题:是否可以阻止这个包装元素?因为对我来说它没有增加任何价值,只是当其他人使用我的网络服务时的一个附加元素。
例如,我想将以下示例中的 <com:MyNameOperation><MyNameReq>
层次结构减少为一个元素,而不是两个嵌套元素。
@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)
。但是,您不能完全删除这 2 个级别,因为需要操作名称来标识操作。更新后的 class 如下所示
@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>