首页 > 解决方案 > 在调用外部 API 之前过滤 Camel 标头

问题描述

我已经像这样定义了 HeaderFilterStrategy

@Configuration
public class HeaderFilterConfiguration extends DefaultHeaderFilterStrategy {
    @Bean("exchangeObjectFilter")
    public void removeExchangeObject() {
        setFilterOnMatch(false);
        Set<String> filters = getOutFilter();
        filters.add("orchestrationExchange");
        setOutFilter(filters);
    }

}

我正在使用此代码使用此过滤策略

from("direct:mock")
                .streamCaching()
                .routeId("orchestration-token")
                .routeDescription("Invokes GET token details to call external endpoints")
                .setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.POST))
                .setHeader(Exchange.CONTENT_TYPE, constant(ContentType.APPLICATION_FORM_URLENCODED.getMimeType()))
                .setBody(header(REQUEST_BODY))
                .toD("http://my-okta-route.com?headerFilterStrategy=#exchangeObjectFilter")
                .unmarshal().json(JsonLibrary.Jackson, TokenResponse.class)
                .log(LoggingLevel.DEBUG, "Successfully processed token. Token response::${body}");

但是当我打印交换对象时,它仍然包含所有标题而没有任何过滤。我检查了所有骆驼资源,但找不到如何在 dsl 中应用 defaultheaderfilterstrategy。

标签: javaspringspring-bootapache-camel

解决方案


HeaderFilterStrategy “从通信中删除标头,而不是从 Exchange 中删除它们”。检查此常见问题解答作为参考。

当我需要从交换中删除标头时,我使用Remove HeaderRemove Headers EIP。

示例 1:使用通配符删除所有 JMS 标头

from("direct:update-document")
  .removeHeaders("JMS*")
  .to("direct:store-test-result") 

示例 2:使用通配符删除所有 JMS 标头

from("direct:update-document")
  .removeHeaders("*")
  .to("direct:store-test-result") 

推荐阅读