【问题标题】:How can I set a property dynamically on an interceptor in spring integration如何在春季集成中的拦截器上动态设置属性
【发布时间】:2016-03-02 12:39:56
【问题描述】:

我们有一个带有拦截器的 web 服务出站网关,它执行一些预处理和后处理,我们需要动态设置拦截器的属性,这与 how to pass values through http headers dynamically using spring integration 情况非常相似,我们尝试实施建议的解决方案,但是我们在运行时遇到异常。

这里是相关代码:

Interceptor相关代码

public class WebServiceClientInterceptor implements ClientInterceptor {
    private final ThreadLocal<HashMap<String, String>> customHeaders = new ThreadLocal<HashMap<String, String>>();
  .....
    public GenericMessage setCustomHeaders(GenericMessage message, String property, String value) {
        log.info("Adding header");
        if (customHeaders.get() == null) {
            log.info("map was null");
            customHeaders.set(new HashMap<String, String>());
        }
        log.info("set " + property + ": " + value);
        customHeaders.get().put(property, value);
        return message;
    }

上下文定义

<int:chain id="getOperatorTynTecCallChain"
    input-channel="inspector.getoperator.tyntec.enricher.input.channel"
    output-channel="inspector.getoperator.results.enricher.output.channel">
    <int:service-activator expression="@webServiceClientInterceptor.setCustomHeaders(#root, 'mcc' , headers.mcc.getFirst())" />
    <int:transformer method="transformRequest" ref="tynTecInspectorPartnerImpl" />
    <int-ws:header-enricher id="getOperatorTynTecHeaderEnricher">
        <int-ws:soap-action value="urn:SyncSuperQueryService" />
    </int-ws:header-enricher>
    <int-ws:outbound-gateway id="getOperatorTynTecOutboundHttpGateway"
        marshaller="xmlBeansMarshaller" unmarshaller="xmlBeansTynTecUnmarshaller"
        requires-reply="true" message-sender="httpComponentsMessageSender"
        uri="${scoretools.inspector.tyntec.url}"> 
        <interceptor="webServiceClientInterceptor">
    </int-ws:outbound-gateway>

    <int:service-activator expression="@tynTecInspectorPartnerImpl.transformResponse(payload, headers.msisdn, headers.mcc)" />
</int:chain>

<bean id="webServiceClientInterceptor" name="webServiceClientInterceptor"
    class="com.cliqdigital.inspector.util.WebServiceClientInterceptor" />

例外情况

16:23:56,338 DEBUG [org.springframework.integration.handler.ExpressionEvaluatingMessageProcessor] (default task-1) SpEL Expression evaluation failed with EvaluationException.: org.springframework.expression.spel.SpelEvaluationException: EL1004E:(pos 29): Method call: Method setCustomHeaders() cannot be found on com.sun.proxy.$Proxy52 type

看起来当拦截器被包裹在代理中时,setCustoHeaders 方法会丢失,知道吗?

【问题讨论】:

    标签: spring web-services spring-integration interceptor


    【解决方案1】:

    为什么要代理拦截器?

    在任何情况下,您都可以更改拦截器以实现一个带有setCustomHeaders(以及ClientInterceptor)的接口。

    代理将公开接口中的所有方法。

    public class WebServiceClientInterceptor implements ClientInterceptor, CustomHeaderSetter {
        ...
    }
    

    【讨论】:

    • 我爱你,我其实是希望你能回答这个问题,而且你像往常一样快速有效地回答了这个问题。我们将尝试您的建议并告诉您结果,顺便说一句,我不知道为什么拦截器被代理,但我认为我们将花费更少的时间来寻找解决方法(即使用接口方法)而不是调查它被代理的原因和使其不被代理。谢谢,安德里亚
    猜你喜欢
    • 2015-04-19
    • 2017-06-11
    • 2016-12-03
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多