2016-07-21 8 views
0

Ich habe einen wsdl Webservice mit cxf erstellt.Wie verhindert man Namespace Wrapper-Tags in SOAP WSDL?

Problem: Sowohl meine Anfrage und Antwort enthalten ein zusätzliches Wrapper-Element mit dem Namespace.

Frage: Ist es möglich, dieses Wrapper-Element zu verhindern? Weil es für mich keinen Mehrwert bringt und nur ein zusätzliches Element ist, wenn andere meinen Webservice nutzen würden.

Zum Beispiel möchte ich die <com:MyNameOperation><MyNameReq> Hierarchie im folgenden Beispiel reduzieren, um nur ein Element, nicht zwei verschachtelte Elemente zu sein.

@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; 
} 

Resultierende Wsdl Struktur:

Anfrage:

<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> 

Antwort:

<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> 

Antwort

2

Sie können Benutzer parameterstyle BLOßER @SOAPBinding(parameterStyle=ParameterStyle.BARE). Sie können die 2 Ebenen jedoch nicht vollständig entfernen, da der Name der Operation zur Identifizierung der Operation erforderlich ist. Die aktualisierte Klasse würde wie folgt aussehen:

@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... 
    } 
} 

Die aktualisierte Anforderung xml wäre.

<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> 

Und Antwort wäre

<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> 
+0

, die perfekt geklappt! – membersound