@midikko
Java-ee + Android разработчик

Как правильно задать chain для template resolvers в thymeleaf?

Выполняю настройку для шаблонизации писем. столкнулся с такой проблемой.

Объявляю бин.

@Bean
	public TemplateResolver mailTemplateResolver() {
		TemplateResolver templateResolver = new ClassLoaderTemplateResolver();
		templateResolver.setPrefix(MAIL);
		templateResolver.setSuffix(".html");
		templateResolver.setOrder(1);
		templateResolver.setCharacterEncoding("UTF-8");
		templateResolver.setTemplateMode("HTML5");
		templateResolver.setCacheable(false);
		return templateResolver;
	}

	@Bean
	public TemplateResolver webTemplateResolver() {
		TemplateResolver templateResolver = new ServletContextTemplateResolver();
		templateResolver.setPrefix(VIEWS);
		templateResolver.setSuffix(".html");
		templateResolver.setCharacterEncoding("UTF-8");
		templateResolver.setOrder(2);
		templateResolver.setTemplateMode("HTML5");
		templateResolver.setCacheable(false);
		return templateResolver;
	}

	@Bean
	public SpringTemplateEngine templateEngine() {
		SpringTemplateEngine templateEngine = new SpringTemplateEngine();
		templateEngine.addTemplateResolver(mailTemplateResolver());
		templateEngine.addTemplateResolver(webTemplateResolver());
		templateEngine.addDialect(new SpringSecurityDialect());
		return templateEngine;
	}

	@Bean
	public AjaxThymeleafViewResolver viewResolver() {
		AjaxThymeleafViewResolver thymeleafViewResolver = new AjaxThymeleafViewResolver();
		thymeleafViewResolver.setTemplateEngine(templateEngine());
		thymeleafViewResolver.setViewClass(FlowAjaxThymeleafView.class);
		thymeleafViewResolver.setCharacterEncoding("UTF-8");
		thymeleafViewResolver.setContentType("text/html; charset=UTF-8");
		return thymeleafViewResolver;
	}


Вроде бы ничего не предвещает беды. Оба бина объявлены последовательно. mail - первый, setOrder у mailResolver'a - первый. Добавляется он в сет резолверов - первый. Но когда я пытаюсь вызвать

final Context ctx = new Context(LocaleContextHolder.getLocale());
					ctx.setVariable("name", "name");
					ctx.setVariable("subscriptionDate", LocalDate.now());
					ctx.setVariable("hobbies", Arrays.asList("Cinema", "Sports", "Music"));

					final String htmlContent = templateEngine.process("welcomeEmail", ctx);


Он подставляет именно ServletContextTemplateResolver. И соответственно, совершенно заслуженно выдает мне

org.thymeleaf.exceptions.TemplateProcessingException: Resource resolution by ServletContext with org.thymeleaf.resourceresolver.ServletContextResourceResolver can only be performed when context implements org.thymeleaf.context.IWebContext [current context: org.thymeleaf.context.Context]


Как быть и как правильно настроить эту шайтанскую машину?
  • Вопрос задан
  • 770 просмотров
Решения вопроса 1
@smegda
Нужно положить файлы шаблонов письма в папку src/main/resources/mail и настройка бина выгдядит так
@Bean
    public ClassLoaderTemplateResolver emailTemplateResolver() {
        ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
        resolver.setPrefix("mail/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode("HTML5");
        resolver.setCacheable(false);
        resolver.setCharacterEncoding("UTF-8");
        resolver.setOrder(1);
        return resolver;
    }

Внимательно устанавливай префикс resolver.setPrefix...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы