Bet*_*sta 4 java web-services cxf jaxb
我的 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>
我发现了这个问题,但是如果我使用这个问题,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>
如果您想在 SOAP 请求中将 arg0 替换为 child,则应该@WebParam(name="child")向方法参数添加注释。
您还可以通过注释服务(类)来影响生成的样式@SOAPBinding(...)- 使用哪种样式取决于您的需求/想法 - 这里请参考我的第一条评论的链接以查看差异。
此外,请查看CXF 文档以了解每个参数的默认值@SOAPBinding。
当您想要删除return响应中的元素时,请注意,这不符合 WS-I,因为只允许一个soap::body 子元素 - 但由于这是您的意图,您应该将默认ParameterStyle.WRAPPED的 SOAPBinding 参数更改为ParameterStyle.BARE。然而,这也可能会改变请求类型。也许看看@ResponseWrapper这里。我还没有使用过它,因此无法提供详细信息。
| 归档时间: | 
 | 
| 查看次数: | 7240 次 | 
| 最近记录: |