Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 向所有传出的CXF请求添加标头_Spring_Client_Cxf - Fatal编程技术网

Spring 向所有传出的CXF请求添加标头

Spring 向所有传出的CXF请求添加标头,spring,client,cxf,Spring,Client,Cxf,是否可以从客户端向所有传出的cxf连接添加头 使用Spring3.0和CXF2.6.0,我已经知道了两种方法。一种是创建SOAP处理程序,并在Spring配置中将其注册为JAX-WS处理程序 检查如何创建SOAP处理程序。当您希望消息头出现在响应(传出请求)中时,请不要忘记,然后需要检查消息是否出站,类似这样的操作可以: Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); if (

是否可以从客户端向所有传出的cxf连接添加头


使用Spring3.0和CXF2.6.0,我已经知道了两种方法。一种是创建SOAP处理程序,并在Spring配置中将其注册为
JAX-WS
处理程序

检查如何创建SOAP处理程序。当您希望消息头出现在响应(传出请求)中时,请不要忘记,然后需要检查消息是否出站,类似这样的操作可以:

Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (outbound) {
    //Modify your header.
}
另一种可能更简单。将标头直接放入CXF响应上下文中。请注意,这个示例只是概念的证明,我不知道在实际情况下,您在响应中需要凭据。它将显示如何将用户凭据对象添加到标题中,您必须根据需要对其进行修改

private void modifyResponse(String username, String password) {
    UserCredentials authHeader = new UserCredentials();
    authHeader.setUsername(username);
    authHeader.setPassword(password);
    ArrayList<Header> headers = new ArrayList<Header>(1);
    try {
        Header soapHeader = new Header(
                new QName("http://yournamespaceuri.com/something", "UserCredentials"),
                authHeader,
                new JAXBDataBinding(UserCredentials.class));
        headers.add(soapHeader);
    } catch (JAXBException ex) {
        LOGGER.error("Exception trying to serialize header: {}", ex);
    }
    ((BindingProvider) proxy).getResponseContext().put(Header.HEADER_LIST, headers);
}
private void modifyResponse(字符串用户名、字符串密码){
UserCredentials authHeader=新的UserCredentials();
authHeader.setUsername(用户名);
authHeader.setPassword(密码);
ArrayList标头=新的ArrayList(1);
试一试{
标题soapHeader=新标题(
新QName(“http://yournamespaceuri.com/something“,“用户凭据”),
authHeader,
新的JAXBDataBinding(UserCredentials.class));
headers.add(soapHeader);
}捕获(JAXBEException-ex){
error(“尝试序列化头{}时出现异常”,ex);
}
((BindingProvider)proxy.getResponseContext().put(Header.Header_列表,headers);
}
此方法需要在客户机发出请求后立即调用

我就是这样做的

Spring.xml

<import resource="classpath:META-INF/cxf/cxf.xml" />

<bean id="cxf" class="org.apache.cxf.bus.spring.SpringBus">
    <property name="outInterceptors">
        <list>
            <ref bean="headerInterceptor"/>
        </list>
    </property>
    <property name="inInterceptors">
        <list>
            <ref bean="headerInterceptor"/>
        </list>
    </property>
</bean>

<bean id="headerInterceptor" class="logging.Interceptor"/>

拦截器:

 public class UUIDHeaderInterceptor extends AbstractPhaseInterceptor {


private static final Logger logger = LoggerFactory.getLogger(UUIDHeaderInterceptor.class);



public UUIDHeaderInterceptor() {
    super(Phase.RECEIVE);

}

@Override
public void handleMessage(Message message) throws Fault {

        Map<String, List<String>> headers = (Map<String, List<String>>) message.get(Message.PROTOCOL_HEADERS);
        headers.put(REQUEST_ID_ATTRIBUTE_NAME, Arrays.asList(new String[]{"TEST"}));

   }
 }

@Override
public void handleFault(Message message) {
    handleMessage(message);
  }
公共类UUIDHeaderInterceptor扩展了AbstractPhaseInterceptor{
私有静态最终记录器Logger=LoggerFactory.getLogger(UUIDHeaderInterceptor.class);
公共UUIDHeaderInterceptor(){
超级(相位接收);
}
@凌驾
public void handleMessage(消息消息消息)引发错误{
映射头=(Map)message.get(message.PROTOCOL_头);
headers.put(请求_ID_属性_名称,Arrays.asList(新字符串[]{“TEST”}));
}
}
@凌驾
公共无效handleFault(消息消息){
handleMessage(消息);
}

我想把我的两分钱给你。在我的帖子里,我正在解决同样的问题-

弹簧配置:-

<jaxws:client id="mywebServiceClient"
    serviceClass="com.saurzcode.TestService"
    address="http://saurzcode.com:8088/mockTestService">

    <jaxws:binding>
        <soap:soapBinding version="1.2" mtomEnabled="true" />
    </jaxws:binding>
</jaxws:client>
<cxf:bus>
    <cxf:outInterceptors>
        <bean class="com.saurzcode.ws.caller.SoapHeaderInterceptor" />
    </cxf:outInterceptors>
</cxf:bus>

CXF拦截器-

public class SoapHeaderInterceptor extends AbstractSoapInterceptor {

    public SoapHeaderInterceptor() {
        super(Phase.POST_LOGICAL);
    }

    @Override
    public void handleMessage(SoapMessage message) throws Fault {
        List<Header> headers = message.getHeaders();
        TestHeader testHeader = new TestHeader();
        JAXBElement<TestHeader> testHeaders = new ObjectFactory()
        .createTestHeader(testHeader);

        try {
            Header header = new Header(testHeaders.getName(), testHeader,
            new JAXBDataBinding(TestHeader.class));
            headers.add(header);
            message.put(Header.HEADER_LIST, headers);

        } catch (JAXBException e) {
            e.printStackTrace();
        }

    }
公共类SoapHeaderInterceptor扩展了AbstractSoapInterceptor{
公共SoapHeaderInterceptor(){
超级(阶段后逻辑);
}
@凌驾
public void handleMessage(SoapMessage消息)引发错误{
List headers=message.getHeaders();
TestHeader TestHeader=新的TestHeader();
JAXBElement testHeaders=newObjectFactory()
.createTestHeader(testHeader);
试一试{
Header Header=新的头(testHeaders.getName(),testHeader,
新的JAXBDataBinding(TestHeader.class));
headers.add(header);
message.put(Header.Header\u列表,headers);
}捕获(JAXBEException e){
e、 printStackTrace();
}
}

Connections?你指的是请求吗?那么是的,这是可能的。是的请求,如果是的话,如何:)?CXF拦截器是另一个选项。它工作正常,只是我的内部元素没有名称空间前缀-比如:有人能帮帮忙吗?如何在没有spring的情况下添加拦截器?只使用CXF wsdl2java客户端对不起,我意识到这条消息是很久以前发布的,但是这里的代理对象是什么?它来自哪里?Thanks@AliH这是一个正确的问题。我认为代理是注入WebServiceContext的,例如
@Resource private WebServiceContext代理;
参考这个?
代理是web服务端口的一个实例来自类的pe。例如:
Service Service=Service.create(url,qname);YourWebService proxy=Service.getPort(YourWebService.class);
其中url是您发布的端点url,qname是与生成的服务类的命名空间映射。