代码之家  ›  专栏  ›  技术社区  ›  dharam

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

  •  0
  • dharam  · 技术社区  · 6 年前

    我正在尝试创建一个涉及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+Freemarker+Freemarker的自定义模板加载程序无法工作。

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Bedla    6 年前

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