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

Posted

技术标签:

【中文标题】Spring Boot + Apache Camel + Freemarker 自定义模板加载器【英文标题】:Spring Boot + Apache Camel + Freemarker Custom Template Loader 【发布时间】:2018-10-22 10:30:10 【问题描述】:

我正在尝试创建一个涉及 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.

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

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

【问题讨论】:

也许你应该在源代码中检查 Camel 如何获取 Template 来执行。也许它不使用Configuration.getTemplate,所以TemplateLoader 永远不会涉及。 【参考方案1】:

您可以将自定义配置全局注册到组件,然后将其应用于所有 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());
    

【讨论】:

我希望这会奏效。我非常感谢您为这个解决方案所做的辛勤工作。我会尽力让你知道.. @dharam,如果你们能在***.com/questions/59220213/… 上查看我的问题,我将不胜感激 - 希望你们中的任何一个都知道..

以上是关于Spring Boot + Apache Camel + Freemarker 自定义模板加载器的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 整合 Apache Dubbo

Apache Ignite 使用 Spring-Boot 加载两次?

apache-shiro 的怪事通过 spring-boot 集成到 spring-mvc 中

mybatis-spring-boot, org.apache.ibatis.binding.BindingException: 无效的绑定语句

Spring-Boot + Spring-MVC + Thymeleaf + Apache Tiles

集成 - Apache Flink + Spring Boot