Сбой автопроводки конфигурации 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"