以下代码抛出无法解析的循环引用错误。当Spring尝试创建MessageFormatHelper类的bean时。运行jar时抛出此错误。我试图看到但没有得到什么是理由。有谁可以帮忙。
头等,
@Component
class DbTemplateResolver extends TemplateResolver {
@Autowired
SpringTemplateEngine templateEngine;
....othercode
@PostConstruct
public void extension() {
templateEngine.addTemplateResolver(this);
}
...other code
}
第二课,
@Component
class MessageFormatHelper{
@Autowired
SpringTemplateEngine templateEngine;
... other code
String getMessage()
{
final Context ctx = new Context(locale);
ctx.setVariable("contractMap", model.get(ContractMap.TEMPLATE_MODEL_MAP_KEY));
mergedMessage = templateEngine.process(fileName, ctx);
}
}
完整错误:
引起:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private com.flex.eventManagement.handler.helper.MessageFormatHelper com.flex.eventManagement.handler.helper.NotificationPreProcessor.messageFormatHelper;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为' messageFormatHelper'的注册:自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:org.thymeleaf.spring4.SpringTemplateEngine com.flex.eventManagement.handler.helper.MessageFormatHelper.templateEngine;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名称为' org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration $ ThymeleafDefaultConfiguration':注册自动连接的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private final java.util.Collection org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration $ ThymeleafDefaultConfiguration.templateResolvers;嵌套异常是org.springframework.beans.factory.BeanCreationException:使用名称' dbTemplateResolver'创建bean时出错:注册自动装配的依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:org.thymeleaf.spring4.SpringTemplateEngine com.flex.eventManagement.handler.helper.DbTemplateResolver.templateEngine;嵌套异常是org.springframework.beans.factory.BeanCurrentlyInCreationException:创建名称为' templateEngine':请求bean的bean当前正在创建时出错:是否存在无法解析的循环引用?
更新 从DbTemplateResolver类中删除模板引擎自动连线。自动装入MessageFormatHelper.java类,如下所示
class MessageFormatHelper{
@Bean
public DbTemplateResolver dbTemplateResolver() {
DbTemplateResolver resolver = new DbTemplateResolver();
resolver.setOrder(2);
return resolver;
}
@Bean
public SpringTemplateEngine thymeleafTemplateEngine() {
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setTemplateResolvers(Sets.newHashSet(dbTemplateResolver()));
return engine;
}
}
另外我需要从MessageFormatHelper中删除SpringTemplateEngine自动连线吗?那么如何调用mergedMessage = templateEngine.process(fileName, ctx);?
更新2。 应该遵循 MessageFormatHelper
中的要求 @Autowired
DbTemplateResolver dbTemplateResolver;
@Autowired
SpringTemplateEngine templateEngine;
@PostConstruct
public void extension() {
templateEngine.addTemplateResolver(dbTemplateResolver);
}
答案 0 :(得分:3)
您的代码存在缺陷,似乎您对Spring的工作原理以及如何使用Spring进行配置缺乏基本的了解。
首先,您使用的是Spring Boot,并希望使用Thymeleaf。这可以通过添加spring-boot-starter-thymeleaf
作为项目的依赖项来完成。 (我假设你已经这样做了。)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf<artifactId>
</dependency>
Spring Boot会检测到您的类路径中有Thymeleaf的事实,ThymeleafAutoConfiguration
将启动并为您配置SpringTemplateEngine
。它甚至会检测ITemplateResolver
类型的每个bean,我假设你的DbTemplateResolver
实现了。
添加DbTemplateResolver
的唯一方法是向@Bean
(或您的应用程序)类添加@Configuration
方法。
@Bean
public ITemplateResolver dbTemplateResolver() {
return new DbTemplateResolver();
}
Spring将检测它并将其注入自动配置的SpringTemplateEngine
。
您唯一需要做的就是在需要SpringTemplateEngine
的课程中自动连线。只使用超级类而不是具体类型。
@Autowired
private TemplateEngine templateEngine;
不要试图稍后尝试配置它,使用框架。