3

我有一个 wsdl,它定义了调用 Web 服务时需要传递的soap 标头。

示例 SOAP 标头是:

<soapenv:Header>
   <AuthenticationInfo>
      <userName>User</userName>
      <password/>
   </AuthenticationInfo>
</soapenv:Header>

CXF 的 wsdl2java 生成了一个“AuthenticationInfo”java 类,我可以创建并使用用户名和密码进行填充,但我不知道在调用 Web 服务时将其传递给 CXF 客户端的正确方法。

4

5 回答 5

11

使用 Apache CXF 生成代理类时,使用 true 添加扩展的SoapHeaders 将生成带有 Request 和 Header 参数的 PortType 类。

<wsdlOption>              
<wsdl>${project.basedir}/src/main/resources/wsdl/sample.wsdl</wsdl>
 <!-- enables processing of implicit SOAP headers, default is false -->
<extendedSoapHeaders>true</extendedSoapHeaders>
</wsdlOption>
于 2018-11-16T02:59:26.980 回答
4

好吧,最简单的方法是创建一个ArrayList对象Header并添加所有参数或 aMap<String,Object>并将所有标题添加为map.put("param1",param1).

最后获取您的请求上下文并将此地图数组列表添加为

requestContext.put(MessageContext.HTTP_REQUEST_HEADERS,
soapHeaders); 

如果您尝试传递自定义肥皂标题,请参阅此链接

THIS DISCUSSION中提到了一般的陷阱。它可能对你有帮助。

于 2012-08-01T21:09:29.657 回答
1

如果 SOAP 标头在 WSDL 中定义,则可以指定为隐式或显式

CXF 提供了wsdl2java 工具,用于从 WSDL 生成 Java 服务接口。在显式标头的情况下,会自动检测 SOAP 标头并将其作为生成的服务接口的一部分提供。

如果已隐式定义 SOAP 标头,则需要启用 -exsh触发隐式 SOAP 标头处理的选项。同样,SOAP 标头将作为生成的服务 Java 接口的一部分提供。如果你想要一个具体的例子,你可以查看我写的一篇关于如何添加 cxf 肥皂标题的博客文章。

请注意,CXF 还支持添加 SOAP 标头的其他方式

于 2017-07-23T15:19:01.260 回答
1

发现自己处于相同的情况:wsdl2java生成了标头类,我需要将其作为 SOAP 标头添加到传出的 SOAP 请求中。

我在代码中的解决方案如下(重用原始问题AuthenticationInfo作为标题类名称):

import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.headers.Header;

AuthenticationInfo ai = new AuthenticationInfo();
ai.setUserName("User");
ai.setPassword("");

List<Header> soapHeaders = new ArrayList<Header>();

Header h1 = new Header(new QName("http://namespace/of/AuthenticationInfo", "AuthenticationInfo"), 
                       ai, new JAXBDataBinding(AuthenticationInfo.class));

soapHeaders.add(h1);

ClientProxy.getClient(port).getRequestContext().put(Header.HEADER_LIST, soapHeaders);
于 2019-12-18T04:56:02.883 回答
0

使用 CXF 3.4.4

您可以像这样添加配置安全性的标头

<soapenv:Header>
    <wsse:Security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/07/secext">
    <wsse:UsernameToken xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility">
    <wsse:Username>MY-USER</wsse:Username>
    <wsse:Password Type="wsse:PasswordText">MY-PWD</wsse:Password>
        </wsse:UsernameToken>
    </wsse:Security>
</soapenv:Header>

使用拦截器,如下所述:http: //cxf.apache.org/docs/ws-security.html

Client serviceClient = ClientProxy.getClient ( port );
        
Endpoint cxfEndpoint = serviceClient.getEndpoint ();
        
Map<String, Object> outProps = new HashMap<> ();
outProps.put ( WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN );
outProps.put ( WSHandlerConstants.USER, "MY-USER" );
outProps.put ( WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT );
outProps.put ( WSHandlerConstants.PW_CALLBACK_CLASS, ClientPasswordCallback.class.getName () ); 
        
WSS4JOutInterceptor requestInterceptor = new WSS4JOutInterceptor ( outProps );
cxfEndpoint.getOutInterceptors ().add ( requestInterceptor );
    
MyRequest request = new MyRequest ();
    
Object [] res = serviceClient.invoke ( "operation-name", request );
MyResponse out = ( MyResponse ) res [0];

其中“操作名称”是要调用的 WebService 操作的名称

WSPasswordCallback 是:

import org.apache.wss4j.common.ext.WSPasswordCallback;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
import java.io.IOException;

public class ClientPasswordCallback implements CallbackHandler {

    public void handle ( Callback [] callbacks ) throws IOException, UnsupportedCallbackException {

        WSPasswordCallback passwordCallback = ( WSPasswordCallback ) callbacks [0];

        // Set the password for our message.
        passwordCallback.setPassword ( "MY-PWD" );
    }
}
于 2021-10-04T20:23:51.923 回答