Spring Boot + Apache Camel + загрузчик пользовательских шаблонов Freemarker - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь создать приложение Spring Boot с использованием Apache Camel.

Маршруты 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 + Custom Template Loader для Freemarker просто не работает.

Если кто-то может указать мне правильное направление, я был бы признателен.

1 Ответ

0 голосов
/ 12 мая 2018

Вы можете зарегистрировать пользовательскую конфигурацию глобально для компонента, которая затем применяется ко всем конечным точкам 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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...