Сбой автопроводки конфигурации Freemarker

Я пытаюсь использовать Freemarker Templating Engine для отправки электронных писем в формате 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.

2 ответа

Решение

Поскольку я использую Spring-boot 1.4.0, нет необходимости предоставлять дополнительную конфигурацию, или я ошибаюсь? Так что у меня больше нет конфигурации xml и java для freemarker. Я не настраивал ее, так как не было необходимости настраивать что-либо в других сервисах, где я использую freemarker.

Если вы не используете стартовый проект, который автоматически настраивает bean-компонент, который настраивает движок Freemarker, вам нужно будет создать его. Что-то вроде этого:

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

Это похоже на довольно хороший справочник для стартового проекта, который настраивает Freemarker для вас.

OOB с Spring существует конфигурация, которая предоставляется именем freeMarkerConfiguration, поэтому вам не нужно определять свой собственный bean-компонент для конфигурации. вам нужно только определить bean-компонент типа FreeMarkerConfigurationFactoryBean.

Пример :

      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 или @Autowire(не рекомендуется), используя:

      @Resource
private Configuration freeMarkerConfiguration;

Проверьте имя bean-компонента «freeMarkerConfiguration». Этот bean-компонент уже определен в файле класса OOB «FreeMarkerReactiveWebConfiguration», который поставляется с spring-boot-autoconfigure. Учитывая, что я использую webflux, имя класса является реактивным, но тогда в других случаях Spring Web будет что-то вроде "FreeMarkerAutoConfiguration.FreeMarkerWebConfiguration"

Другие вопросы по тегам