2

我试图弄清楚如何处理 SOAP 请求,其中 SOAPAction 在消息头中指定,但不在消息正文中。以下是我需要处理的示例请求。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://soap.afis.com/">
   <soapenv:Header/>
   <soapenv:Body>
         <String>12</String>
   </soapenv:Body>
</soapenv:Envelope>

SOAPAction 位于上述请求的标头中,如下所示:

SOAPAction:“瓮:进程”

以下是一个有效的请求。注意“过程”元素(又名 SOAPAction)。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soap="http://soap.afis.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <soap:process>
         <String>12</String>
      </soap:process>
   </soapenv:Body>
</soapenv:Envelope>

这是 CXF 端点:

<cxf:cxfEndpoint id="afisProcessEndpoint"
                     address="/wildcat"
                     serviceClass="com.afis.CCHEndpointImpl"/>

这是实现:

@WebService(serviceName = "com.CCHEndpoint")
public class CCHEndpointImpl implements CCHEndpoint {
    @Override
    @WebMethod(operationName = "process", action = "urn:process")
    public String process(@WebParam(partName = "String", name = "String") String string) {
        return "sd";
    }
}

这是界面:

@WebService
public interface CCHEndpoint {
    @WebMethod(operationName = "process", action = "urn:process")
    public String process(@WebParam(partName = "String", name = "String")String string);
}

如果我在 XML 中(但在 SOAP 标头中)提交没有流程元素的请求,我会得到以下信息:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Client</faultcode>
         <faultstring>Unexpected wrapper element String found.   Expected {http://soap.afis.com/}process.</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

请注意,使用 Axis2,我能够处理此类请求,因为 services.xml 将操作映射到我们的操作,但我无法在此项目中使用 Axis2。我需要一个与 CXF 等效的机制。我觉得cxfEndpoint中的额外配置,或者可能是注释,但我找不到解决方案。

4

1 回答 1

2

请求中的<soap:process>元素实际上与操作无关。那是一个包装元素。根据 JAX-WS 规范,默认情况下,服务是在“包装”模式下创建的,其中有一个包装器元素作为soap Body 的直接子元素。如果您不想要那样并且只想要直接操作参数,那么您需要将@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)注释添加到界面上。

于 2013-05-31T20:29:51.153 回答