@Conditional注释导致嵌套bean上的BeanCreationException

时间:2018-05-21 20:18:21

标签: conditional spring-4 beancreationexception

我正在使用Spring 4.x,我使用@Conditional批注来控制bean注册。 我的课程定义如下,

@Controller
class SchoolController{
   @Autowired
   @Qualifier("studentProcessor")
   private StudentProcessor studentProcessor;
   //Some code
}

@Component("studentProcessor")
class StudentProcessor{
   @Autiwired
   private SportService sportService;
   //Some code
}

@Component
@Conditional(ServiceCondition.class)
class SportService{
//Some code
}

class ServiceCondition implements Condition{
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
  //Some condition
}
}

当我启动Tomcat时,我得到以下异常: org.springframework.beans.factory.BeanCreationException:创建名为' studentProcessor'的注册自动连接依赖项失败;嵌套异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:com.student.service.SportService com.student.processors.StudentProcessor.sportService;嵌套异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为[com.student.service.SportService]的限定bean用于依赖:预期至少有1个bean可以作为此依赖项的autowire候选者。依赖注释:{@ org.springframework.beans.factory.annotation.Autowired(required = true)}

  1. 这是预期的行为吗?
  2. 如果没有,那我该怎么摆脱这个问题?

1 个答案:

答案 0 :(得分:2)

根据您的配置,SportService bean 根据ServiceCondition的条件实施加载。

因此,如果matches方法由于某种原因根据您的逻辑返回false,那么SportService将不会被创建,也不会用于自动装配。

话虽如此,StudentProcessor @Autowired无法具体SportService

我不完全了解您的要求,但是要继续进行此配置,您需要将自动装配标记为可选。

@Autiwired
private SportService sportService;
//Some code

@Autiwired(required = false)
private SportService sportService;
//Some code

此外,您需要检查实例是否已注入,然后再使用它。