gpt4 book ai didi

java - Spring Boot + Apache Camel + Freemarker 自定义模板加载器

转载 作者:行者123 更新时间:2023-12-02 02:09:04 25 4
gpt4 key购买 nike

我正在尝试创建一个涉及 Apache Camel 的 Spring Boot 应用程序。

Camel 路由包含使用 FreeMarker 模板的消息转换(为此,我使用 Camel 的 Freemarker 集成)

from("direct:temporary").routeId("hello").to("freemarker:db:test-spot").end().to("stream:out");

Freemarker 模板存储在数据库中,我正在尝试使用自定义模板加载器(例如 DBTemplateLoader)加载它

但是,我还没有成功!原因是,即使我注册了自定义模板加载器,它也会求助于 FreeMarkerComponent 来加载模板,当然它不知道我的数据库。

这是我收到的错误

freemarker.template.TemplateNotFoundException: Template not found for name "db:test-spot".
The name was interpreted by this TemplateLoader: org.apache.camel.component.freemarker.FreemarkerComponent$1@3dbbfc3a.

我已经尝试了网络上的大部分资源。所有这些东西都可以很好地隔离,但是 Apache Camel + FreeeMarker + Freemarker 的自定义模板加载器不起作用。

如果有人能指出我正确的方向,那么我将不胜感激。

最佳答案

您可以将自定义配置全局注册到组件,然后将其应用于所有 freemarker 端点。或者使用配置 URI 参数本地连接到单个端点。

将配置注册到组件:

FreemarkerComponent freemarkerComponent = getContext().getComponent("freemarker", FreemarkerComponent.class);
freemarkerComponent.setConfiguration(myConfiguration);

将配置注册到单个端点:

.to("freemarker:dummy?configuration=#freemarkerConfiguration") // freemarkerConfiguration is custom bean in registry
<小时/>

我已经创建了用于演示的单元测试:

public class CamelCustomFreemarkerLoader extends CamelTestSupport {

@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
Configuration myConfiguration = new Configuration();
StringTemplateLoader dummyLoader = new StringTemplateLoader();
dummyLoader.putTemplate("dummy", "Hello from dummy template");
myConfiguration.setTemplateLoader(dummyLoader);

FreemarkerComponent freemarkerComponent = getContext().getComponent("freemarker", FreemarkerComponent.class);
freemarkerComponent.setConfiguration(myConfiguration);

from("direct:test")
.to("freemarker:dummy")
.to("mock:result");
}
};
}

@Test
public void testCustomTemplateLoader() throws Exception{
MockEndpoint mockEndpoint = getMockEndpoint("mock:result");
template.sendBody("direct:test",null);
mockEndpoint.setExpectedCount(1);
mockEndpoint.assertIsSatisfied();
Assert.assertEquals("Hello from dummy template", mockEndpoint.getExchanges().get(0).getIn().getBody());
}
}

关于java - Spring Boot + Apache Camel + Freemarker 自定义模板加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50301922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com