百里香的错误

时间:2016-04-21 08:38:35

标签: thymeleaf

以下代码抛出无法解析的循环引用错误。当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);
    }

1 个答案:

答案 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;

不要试图稍后尝试配置它,使用框架。