Java 弹簧靴&x2B;阿帕奇骆驼&x2B;Freemarker自定义模板加载程序

Java 弹簧靴&x2B;阿帕奇骆驼&x2B;Freemarker自定义模板加载程序,java,spring-boot,apache-camel,freemarker,Java,Spring Boot,Apache Camel,Freemarker,我正在尝试创建一个涉及ApacheCamel的Spring引导应用程序 Camel路由由使用FreeMarker模板的消息转换组成(为此,我使用Camel的FreeMarker集成) Freemarker模板存储在数据库中,我正在尝试使用自定义模板加载程序(比如DBTemplateLoader)加载它 然而,我还没有成功!原因是,即使我注册了我的自定义模板加载器,它也会求助于FreeMarkerComponent来加载模板,当然它不知道我的数据库 这是我得到的错误 freemarker.temp

我正在尝试创建一个涉及ApacheCamel的Spring引导应用程序

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

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.
我已经尝试了网络上的大部分资源。所有这些都可以在隔离状态下很好地工作,但是ApacheCamel+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());
    }
}
将配置注册到单个端点:

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());
    }
}

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

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());
    }
}

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

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());
    }
}

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

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());
    }
}

也许您应该在源代码中检查Camel是如何执行
模板的。可能它没有使用
配置。getTemplate
,因此从来没有涉及
模板加载程序
。可能您应该在源代码中检查Camel如何执行
模板
。也许它没有使用
配置.getTemplate
,所以
TemplateLoader
从未涉及过。我希望这能起作用。我真的很感谢你为这个解决方案所做的努力。我会尽量让你们知道的。@dharam,如果你们能看看我的问题,我将不胜感激——希望你们中的任何一位都能知道。。我希望这会奏效。我真的很感谢你为这个解决方案所做的努力。我会尽量让你们知道。@dharam,如果你们能看看我的问题,我将不胜感激——希望你们中的任何一位都能知道。。