Freemarker 配置的自动装配失败

Autowiring of Freemarker configuration fails

我正在尝试使用 Freemarker 模板引擎发送 html 格式的电子邮件。 我不得不在几个服务中这样做。 在一项服务中,freemarker 运行良好,但在另一项服务中则不然。 但是与 freemarker 相关的代码实际上是相同的。

的自动装配
@Autowired
private Configuration freeMarkerConfig;

不在一项服务中工作,但在另一项服务中工作。 自动装配出现在层次结构中(例如控制器自动装配服务,服务自动装配邮件服务,邮件服务自动装配另一个组件,自动装配 freemarker ... 我不知道如何解决这个问题。 错误堆栈跟踪:

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 的其他服务中配置任何东西。

As I am using spring-boot 1.4.0, there's no need to provide more configuration, or am I wrong ? So i dont have any further xml nor java configuration for freemarker.. I didnt configured it, as there was no need to configure anything in other services, where I use freemarker.

除非您使用的入门项目会自动设置一个配置 Freemarker 引擎的 bean,否则您需要创建一个。像这样:

@Configuration
public class MyConfiguration {
    @Bean
    freemarker.template.Configuration freeMarkerConfig() {
       return someConfigBeanInstantiatedHere;
    }
}

This 看起来像是为您设置 Freemarker 的入门项目的一个很好的参考。

OOB 与 spring 有一个由名称 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;
    }
}

现在在您的服务中 class 只需使用 @Resource 或 @Autowire(不推荐):

@Resource
private Configuration freeMarkerConfiguration;

请检查 bean 的名称“freeMarkerConfiguration”。此 bean 已在 spring-boot-autoconfigure 附带的 OOB class 文件 'FreeMarkerReactiveWebConfiguration' 中定义。考虑到我使用的是 webflux,class 名称具有反应性,但在 spring web 的其他情况下,会有类似“FreeMarkerAutoConfiguration.FreeMarkerWebConfiguration”

的内容