我的CXF项目工作正常。
我的WS界面是
package net.betlista.ws;
import javax.jws.WebMethod;
import javax.jws.WebService;
import org.apache.cxf.annotations.EndpointProperty;
@WebService
public interface TestWs {
@WebMethod
Result foo(String child);
}
实施是
package net.betlista.ws;
import org.springframework.stereotype.Component;
@Component("testWsEndpoint")
public class TestWsImpl implements TestWs {
@Override
public Result foo(final String child) {
Result res = new Result();
res.status = "ok";
res.data = "bar";
return res;
}
}
结果类型类:
package net.betlista.ws;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
//@XmlTransient - NOT working
@XmlType
//@SOAPBinding(parameterStyle=SOAPBinding.ParameterStyle.BARE) - NOT working
public class Result {
@XmlElement
String status;
@XmlElement
String data;
}
当我通过请求调用WS时:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.betlista.net/">
<soapenv:Header/>
<soapenv:Body>
<ws:foo>
<arg0>a</arg0>
</ws:foo>
</soapenv:Body>
</soapenv:Envelope>
结果是:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:fooResponse xmlns:ns2="http://ws.betlista.net/">
<return>
<status>ok</status>
<data>bar</data>
</return>
</ns2:fooResponse>
</soap:Body>
</soap:Envelope>
我想跳过这个return
元素。
我想:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:fooResponse xmlns:ns2="http://ws.betlista.net/">
<status>ok</status>
<data>bar</data>
</ns2:fooResponse>
</soap:Body>
</soap:Envelope>
我发现了this问题,但是如果我使用了这个问题,那么元素arg
也会在请求中丢失,这是我不想要的东西。
我尝试使用此@SOAPBinding
注释方法(按上述方式工作)以及类型Result
(不工作)。
请求的WSDL:
<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.betlista.net/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="TestWsImplService" targetNamespace="http://ws.betlista.net/">
<wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws.betlista.net/" elementFormDefault="unqualified" targetNamespace="http://ws.betlista.net/" version="1.0">
<xs:element name="foo" type="tns:foo"/>
<xs:element name="fooResponse" type="tns:fooResponse"/>
<xs:complexType name="foo">
<xs:sequence>
<xs:element minOccurs="0" name="arg0" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fooResponse">
<xs:sequence>
<xs:element minOccurs="0" name="return" type="tns:result"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="result">
<xs:sequence>
<xs:element minOccurs="0" name="status" type="xs:string"/>
<xs:element minOccurs="0" name="data" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
<wsdl:message name="foo">
<wsdl:part element="tns:foo" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:message name="fooResponse">
<wsdl:part element="tns:fooResponse" name="parameters">
</wsdl:part>
</wsdl:message>
<wsdl:portType name="TestWs">
<wsdl:operation name="foo">
<wsdl:input message="tns:foo" name="foo">
</wsdl:input>
<wsdl:output message="tns:fooResponse" name="fooResponse">
</wsdl:output>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="TestWsImplServiceSoapBinding" type="tns:TestWs">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="foo">
<soap:operation soapAction="" style="document"/>
<wsdl:input name="foo">
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output name="fooResponse">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="TestWsImplService">
<wsdl:port binding="tns:TestWsImplServiceSoapBinding" name="TestWsImplPort">
<soap:address location="http://localhost:8080/tests-wicket-cxf/ws/TestWs"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
答案 0 :(得分:4)
如果要在SOAP请求中用子代替arg0,则应在方法参数中添加@WebParam(name="child")
注释。
您可以通过使用@SOAPBinding(...)
注释服务(班级)来对制作的风格产生影响 - 使用哪种风格取决于您的需求/威尔士 - 请参阅我的第一条评论链接差异。
此外,请查看CXF docs以查看每个@SOAPBinding
参数的默认值。
由于你想摆脱响应中的return
元素,请注意这不是WS-I complient,因为只允许一个soap :: body child - 但是因为这是你的意图你应将ParameterStyle.WRAPPED
默认SOAPBinding参数更改为ParameterStyle.BARE
。但是,这也可能会改变请求类型。也许在这里查看@ResponseWrapper
。我还没有使用它,所以我无法提供详细信息。
答案 1 :(得分:2)
您可以通过在界面和实现中添加@javax.jws.WebResult(name =&#34; result&#34;)来代替<return>
标记,而不是像<result>
那样使用自己的标记。
@Override
@javax.jws.WebResult(name = "result")
public Result foo(final String child) {
Result res = new Result();
res.status = "ok";
res.data = "bar";
return res;
}