我有一个wsdl,它定义了在调用Web服务时需要传递的soap头。
示例SOAP Header是:
<soapenv:Header>
<AuthenticationInfo>
<userName>User</userName>
<password/>
</AuthenticationInfo>
</soapenv:Header>
CXF的wsdl2java生成了一个“AuthenticationInfo”java类,我可以创建并填充用户名和密码,但我不知道在调用Web服务时将其传递给CXF客户端的正确方法。
答案 0 :(得分:4)
嗯,最简单的方法是创建ArrayList
个Header
个对象并添加所有参数或Map<String,Object>
并将所有标题添加为map.put("param1",param1).
}
最后获取您的请求上下文并将此地图的arraylist添加为
requestContext.put(MessageContext.HTTP_REQUEST_HEADERS,
soapHeaders);
如果您尝试传递自定义soap标头,请参阅THIS LINK。
THIS DISCUSSION中提到了一般性陷阱。它可能对你有帮助。
答案 1 :(得分:1)
如果在WSDL中定义了SOAP标头,则可以指定它implicit or explicit。
CXF提供wsdl2java tool用于从WSDL生成Java服务接口。对于显式标头,SOAP标头会自动检测到,并作为生成的服务接口的一部分提供。
如果已隐式定义SOAP标头,则需要启用-exsh
选项,该选项触发隐式SOAP标头的处理。 SOAP标头将再次作为生成的服务Java接口的一部分提供。如果你想要一个具体的例子,你可以查看我在how to add a cxf soap header上发表的博文。
请注意,CXF还支持other ways of adding SOAP headers。
答案 2 :(得分:1)
在使用Apache CXF生成proxy类时,通过将extendedSoapHeaders与true一起添加,将会生成带有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>
答案 3 :(得分:0)
发现自己处于相同的情况: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);