【发布时间】:2015-09-23 12:37:48
【问题描述】:
我已按照 Thymeleaf 教程“Rich HTML email in Spring with Thymeleaf”使用 Thymeleaf 模板生成电子邮件。 一切都很好,但我无法访问我在应用程序其他地方使用的 ApplicationContext bean。
更具体地说,在我的电子邮件模板中,我希望有类似的内容:
<span th:text="${@myBean.doSomething()}">
其中“myBean”是一个@Component。 这有可能吗? 我不是在寻找像
这样的解决方法<span th:text="${myBean.doSomething()}">
bean 作为变量添加到模板处理上下文中。
配置:
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
public class MyWebConfig extends WebMvcConfigurerAdapter {
[....]
public ClassLoaderTemplateResolver emailTemplateResolver() {
ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
resolver.setPrefix("emailtemplates/");
resolver.setSuffix(".html");
resolver.setCharacterEncoding("UTF-8");
resolver.setTemplateMode("HTML5");
return resolver;
}
@Bean
public SpringTemplateEngine emailTemplateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.addTemplateResolver(emailTemplateResolver());
engine.addDialect(new LayoutDialect()); // thymeleaf-layout-dialect
addSpringSecurityDialect(engine); // thymeleaf-SpringSecurity-dialect
return engine;
}
[....]
}
电子邮件服务:
@Service
public class MyEmailService {
@Resource SpringTemplateEngine emailTemplateEngine;
[....]
public boolean sendHtmlEmail(...) {
final Context ctx = new Context(locale);
ctx.setVariable("someVariable", "someValue"); // Don't want to add myBean here
final String body = this.emailTemplateEngine.process("myTemplate", ctx);
[....]
组件:
@Component
public class MyBean {
public String doSomething() {
return "Something done!";
}
}
模板:
<span th:text="${@myBean.doSomething()}">
错误:
EL1057E:(pos 1): 没有在上下文中注册的 bean 解析器来解析 访问 bean 'myBean'
我正在使用 thymeleaf-2.1.4 和 spring-4.1.6
编辑:
请注意,我不能使用 HttpServletRequest,因为我以 @Async 方法发送大部分电子邮件,其中无法可靠地使用请求。这就是我使用 Context 而不是 WebContext 的原因(尽管我不知道 SpringWebContext - 我猜如果有人通过“beans”变量创建了用于访问 bean 的类,那么使用 @myBean 表示法肯定是不可能的)。
【问题讨论】:
-
尝试使用 SpringWebContext 而不是 Context。
-
SpringWebContext 是一个很好的建议,因为它添加了“类 (Beans) 的特殊 bean 变量,允许用户在应用程序上下文中访问 bean。这个变量可以像上下文中的任何其他变量一样被访问:${beans.myBean.doSomething()}。”不过,在我的特殊情况下,我没有提到我也不能使用 Request 对象,因为我在 @Async 中发送电子邮件 - 现在更新问题。
-
是否可以选择自定义上下文实现? javased.com/?source_dir=thymeleaf-spring3/src/main/java/org/…
-
是的,可以选择自定义上下文!如何将“@”变量的解析添加到上下文中?