繁体   English   中英

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

[英]Spring Boot + Apache Camel + Freemarker Custom Template Loader

我正在尝试创建一个涉及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端点。 或使用configuration 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());
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM