@Conditional 注释在嵌套 bean 上导致 BeanCreationException
@Conditional annotation causing BeanCreationException on nested beans
我正在使用 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' 的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 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 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
- 这是预期的行为吗?
- 如果没有,我该如何解决这个问题?
根据您的配置,SportService
bean 根据 ServiceCondition
的条件实现 加载。
因此,如果 matches
方法 returns false
出于某种原因基于您的逻辑,那么 SportService
将不会被创建并且无法用于自动装配。
话虽这么说,StudentProcessor
不能有 SportService
的具体 @Autowired
。
我不完全了解您的要求,但要继续进行此配置,您需要将自动装配标记为可选。
@Autiwired
private SportService sportService;
//Some code
到
@Autiwired(required = false)
private SportService sportService;
//Some code
另外,您需要检查实例是否被注入,然后使用它。
我正在使用 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' 的 bean 时出错:注入自动装配的依赖项失败;嵌套异常是 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 有资格作为此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
- 这是预期的行为吗?
- 如果没有,我该如何解决这个问题?
根据您的配置,SportService
bean 根据 ServiceCondition
的条件实现 加载。
因此,如果 matches
方法 returns false
出于某种原因基于您的逻辑,那么 SportService
将不会被创建并且无法用于自动装配。
话虽这么说,StudentProcessor
不能有 SportService
的具体 @Autowired
。
我不完全了解您的要求,但要继续进行此配置,您需要将自动装配标记为可选。
@Autiwired
private SportService sportService;
//Some code
到
@Autiwired(required = false)
private SportService sportService;
//Some code
另外,您需要检查实例是否被注入,然后使用它。