您好我想在我的身体上设置一个SQL语句,以便之后由jdbc组件使用。我在资源中有我的sql脚本,因此我可以利用简单的语言从资源中加载resource:classpath
。问题是url不是静态的,我想加载不同的文件,具体取决于我得到的标题(``)。
<!-- INSERT data -->
<setBody>
<simple>resource:classpath:sql/${header.CamelCustomer}/Insert.sql</simple>
</setBody>
假设我有2个客户A和B.这意味着我还有2个目录
如何使用标题加载不同的文件?
提前致谢!
答案 0 :(得分:2)
您可以使用Content Enricher integration pattern并使用Language component包装简单表达式以进行评估。
这应该会返回预期的结果:
Java DSL:
.enrich().simple("language:simple:resource:classpath:sql/${header.CamelCustomer}/Insert.sql")
XML DSL:
<enrich><simple>language:simple:resource:classpath:sql/${header.CamelCustomer}/Insert.sql</simple></enrich>
我已经为演示创建了样本单元测试。
<强>的src /测试/资源/ SQL / A / Insert.sql 强>
INSERT something INTO A;
<强>的src /测试/资源/ SQL / B / Insert.sql 强>
INSERT something INTO B;
<强> DynamicLoadResourceTest 强>
public class DynamicLoadResourceTest extends CamelTestSupport {
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
from("direct:start")
.enrich().simple("language:simple:resource:classpath:sql/${header.CamelCustomer}/Insert.sql")
.to("mock:done");
}
};
}
@Test
public void testContentEnrichResource() throws Exception {
MockEndpoint done = getMockEndpoint("mock:done");
Map<String, Object> headers = new HashMap<>();
headers.put("CamelCustomer", "A");
sendBody("direct:start", null, headers);
headers.put("CamelCustomer", "B");
sendBody("direct:start", null, headers);
done.setExpectedCount(2);
done.assertIsSatisfied();
Assert.assertEquals(
"INSERT something INTO A;",
done.getExchanges().get(0).getIn().getBody()
);
Assert.assertEquals(
"INSERT something INTO B;",
done.getExchanges().get(1).getIn().getBody()
);
}
}