将参数传递给Spring soap拦截器

时间:2016-09-08 04:24:27

标签: java spring web-services soap spring-integration

我有弹出集成出站网关,可以进行Web服务调用。 我有一个截取SOAP请求和日志到日志文件的拦截器。现在我想将一个参数传递给interceptor类的handleRequest方法,以便我可以将每个记录的soap请求与数据库中的id相关联。

我需要传递给拦截器的值id存储在名为id的标头中 代码看起来像下面的内容。

<int-ws:outbound-gateway  uri="${soap.url} interceptor="interceptor"  >
</int-ws:outbound-gateway>

下面是拦截器。

public class Interceptor implements ClientInterceptor {

@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {

//id below is parameter that needs to be passed.

    LOGGER.info("soap request for "+id +" is " +messageContext.getRequest().getDocument().toString());

    return true;
}

}

我想过在bean定义中为Interface设置一个属性。

<bean id="interceptor" class="com.services.Interceptor" >
    <property name="id" value="#{headers['id']}" />
</bean>

但这不起作用,因为我无法以某种方式访问​​标题。在服务器启动期间获得异常..即使我解决了这个异常,这也会出现问题,因为对象是singleton.Any其他指针在这里吗?

    Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Property or field 'headers' cannot be found on object of type 'org.spri
ngframework.beans.factory.config.BeanExpressionContext' - maybe not public?
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:224)
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:94)
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:81)
        at org.springframework.expression.spel.ast.CompoundExpression.getValueRef(CompoundExpression.java:51)
        at org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:87)
        at org.springframework.expression.spel.ast.SpelNodeImpl.getValue(SpelNodeImpl.java:120)
        at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:242)

1 个答案:

答案 0 :(得分:0)

请参阅我对your other question的回答,了解为什么你不能做你想做的事。

要将参数传递给拦截器,可以使用ThreadLocal - 在网关上游添加服务来设置值,然后在拦截器中检索/删除它。