Freemarker配置的自动装配失败

时间:2016-10-18 11:35:35

标签: java spring freemarker autowired

我尝试使用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。

2 个答案:

答案 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”的内容