我尝试使用Freemarker模板引擎发送html格式的电子邮件。 我必须在几个服务中这样做。 在一项服务中,freemarker工作正常,但不在另一项服务中。 但是,与freemarker相关的代码实际上是相同的。
的自动装配@Autowired
private Configuration freeMarkerConfig;
不是在一个服务中工作,而是在另一个服务中工作。 自动装配出现在层次结构中(例如控制器自动装配服务,服务自动装配邮件服务,邮件服务自动装配另一个组件,自动装配自由标记... 我无法弄清楚如何解决这个问题。 错误堆栈跟踪:
Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'userController':
Unsatisfied dependency expressed through field 'userService':
Error creating bean with name 'userService':
Unsatisfied dependency expressed through field 'mailService':
Error creating bean with name 'mailServiceImpl':
Unsatisfied dependency expressed through field 'mailMessages':
Error creating bean with name 'mailMessages':
Unsatisfied dependency expressed through field 'freeMarkerConfig':
No qualifying bean of type [freemarker.template.Configuration] found for dependency [freemarker.template.Configuration]: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [freemarker.template.Configuration] found for dependency [freemarker.template.Configuration]: expected at least 1 bean which qualifies as autowire candidate for this dependency.
由于我使用的是spring-boot 1.4.0,因此无需提供更多配置,或者我错了?所以我没有任何进一步的xml或java配置freemarker ..我没有配置它,因为没有必要在其他服务配置任何东西,我使用freemarker。
答案 0 :(得分:2)
由于我使用的是spring-boot 1.4.0,因此无需提供更多内容 配置,还是我错了?所以我没有任何进一步的xml也没有java freemarker的配置..我没有配置它,因为没有 需要在其他服务中配置任何东西,我使用freemarker。
除非您使用自动设置配置Freemarker引擎的bean的启动项目,否则您需要创建一个。像这样:
@Configuration
public class MyConfiguration {
@Bean
freemarker.template.Configuration freeMarkerConfig() {
return someConfigBeanInstantiatedHere;
}
}
对于为您设置Freemarker的初学者项目,This看起来非常不错。
答案 1 :(得分:0)
带有 spring 的 OOB 有一个配置,该配置由 freeMarkerConfiguration 的名称提供,因此您无需定义自己的 bean 进行配置。你只需要定义一个 FreeMarkerConfigurationFactoryBean 类型的 bean。
示例:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean;
@Configuration
public class FreemarkerConfig {
@Bean
public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
bean.setTemplateLoaderPath("/templates/");
return bean;
}
}
现在在您的服务类中只需使用:
@Resource
private Configuration freeMarkerConfiguration;
请检查 bean 的名称“freeMarkerConfiguration”。这个 bean 已经在 spring-boot-autoconfigure 附带的 OOB 类文件“FreeMarkerReactiveWebConfiguration”中定义。考虑到我使用的是 webflux,类名具有反应性,但在 spring web 的其他情况下,会有类似“FreeMarkerAutoConfiguration.FreeMarkerWebConfiguration”的内容