Java 当有两个相同的名称和不同的类bean时,如何通过名称获得正确的bean
我有两颗春豆。它们的名称相同,但类不同 下面是bean定义 这是第一个Java 当有两个相同的名称和不同的类bean时,如何通过名称获得正确的bean,java,spring,spring-boot,javabeans,Java,Spring,Spring Boot,Javabeans,我有两颗春豆。它们的名称相同,但类不同 下面是bean定义 这是第一个 @Bean(name = "approve_sign_up_project_request|Task_1tm7e53") public StudentTaskToResponseDataConverter perfectUserProfileVO() { return studentTaskVO -> { ResponseVo vo = toResponseVO(stud
@Bean(name = "approve_sign_up_project_request|Task_1tm7e53")
public StudentTaskToResponseDataConverter perfectUserProfileVO() {
return studentTaskVO -> {
ResponseVo vo = toResponseVO(studentTaskVO);
vo.setData(new PerfectUserProfileVO());
return vo;
};
}
这是第二个
@Bean(name = "approve_sign_up_project_request|Task_1tm7e53")
public UserTaskCompleter perfectUserProfile() {
return new UserTaskCompleter() {
@Override
public void validate(Task task, CompleteUserTaskDTO dto) throws RuntimeException {
Long studentId = getStudentId(task);
UserProfileIntegrityValidatedResultDTO results = userService.
validateTheIntegrityOfUserProfile(studentId);
if (results.getComplete()) {
//nothing to do for now
}else {
LOGGER.error("Validated failed cause the student -- {} not yet perfected the profile",
studentId);
throw new UserProfileImperfectException("Missing fields are " + results.getMissingFields());
}
}
@Override
public void executeBusinessLogic(Task task, CompleteUserTaskDTO dto) {
}
@Override
public Map<String, Object> getTheVariablesForCompleterUserTask(Task task, CompleteUserTaskDTO dto) {
return null;
}
};
}
这是个例外
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'approve_sign_up_project_request|Task_1tm7e53' is expected to be of type 'com.hikedu.backend.camunda.beanconfig.taskcompleter.UserTaskCompleter' but was actually of type 'com.hikedu.backend.camunda.beanconfig.tasktoresponsedatecoverter.signupprojectprocess.SignUpProjectProcessTaskConverterConfig$$Lambda$625/484805627'
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:384)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1091)
at com.hikedu.backend.camunda.beanconfig.taskcompleter.BaseUserTaskCompleter.getBean(BaseUserTaskCompleter.java:45)
at com.hikedu.backend.camunda.beanconfig.taskcompleter.BaseUserTaskCompleter.validate(BaseUserTaskCompleter.java:29)
at com.hikedu.backend.service.impl.camunda.signupprojectprocess.BaseSignUpProjectProcessServiceImpl.completeUserTask(BaseSignUpProjectProcessServiceImpl.java:165)
at com.hikedu.backend.controller.SignUpProjectProcessUserTaskController.completerStudentTask(SignUpProjectProcessUserTaskController.java:93)
at com.hikedu.backend.controller.SignUpProjectProcessUserTaskController$$FastClassBySpringCGLIB$$a695dddd.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
org.springframework.beans.factory.beanNotorRequiredTypeException:名为'approve_sign_up_project_request | Task_1tm7e53'的Bean应为'com.hikedu.backend.camunda.beanconfig.taskcompleter.UserTaskCompleter'类型,但实际上为''com.hikedu.backend.camunda.beanconfig.TaskToResponse.signupprojectprocess.SignUpProjectProcessTaskConverterConfig$$Lambda$625/484805627'
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:384)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:205)
位于org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1091)
在com.hikedu.backend.camunda.beanconfig.taskcompleter.BaseUserTaskCompleter.getBean(BaseUserTaskCompleter.java:45)
在com.hikedu.backend.camunda.beanconfig.taskcompleter.BaseUserTaskCompleter.validate(BaseUserTaskCompleter.java:29)
位于com.hikedu.backend.service.impl.camunda.signupprojectprocess.BaseSignUpProjectProcessServiceImpl.CompleteSertask(BaseSignUpProjectProcessServiceImpl.java:165)
位于com.hikedu.backend.controller.SignUpProjectProcessUserTaskController.completerStudentTask(SignUpProjectProcessUserTaskController.java:93)
位于com.hikedu.backend.controller.SignUpProjectProcessUserTaskController$$FastClassBySpringCGLIB$$a695dddd.invoke()
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
有人能告诉我,当有两个相同的名字和不同的CalsBean时,如何通过名称获得正确的bean。我已经理解了原因 当定义两个相同名称和不同类型的bean时。spring将选择最后一个来覆盖其他 在我的例子中,只有一个名为“approve\u sign\u project\u request | Task\u 1tm7e53”的bean,类型是studenttasktoreresponse 当我使用名称和UserTaskCompleter类型从beanFactory获取bean时
弹簧找不到它,然后弹簧会抛出多余的部分 如何允许spring创建同名bean 我从中找到答案 这是答案的重要部分 您可以在构建Spring Boot应用程序时使用初始值设定项:
@SpringBootApplication
public class SpringBootApp {
public static void main(String... args) {
new SpringApplicationBuilder(SpringBootApp.class)
.initializers(new ApplicationContextInitializer<GenericApplicationContext>() {
@Override
public void initialize(GenericApplicationContext applicationContext) {
applicationContext.setAllowBeanDefinitionOverriding(false);
}
})
.run(args);
}
}
Himly引用的答案并没有让Spring创建同名的bean。 它实际上阻止它启动,因为构建应用程序将失败
如果使用相同的名称定义了多个bean,那么后面定义的bean将覆盖前面定义的bean。因此,在您的情况下,只有一个名为
approve\u sign\u project\u request | Task\u 1tm7e53
的bean将存在,除非您禁用bean定义覆盖。大家好。当我为其中一个bean更改bean名称时,它工作得很好。问题变成了如何在springBoot中创建两个同名不同类型的bean?有没有办法禁用bean定义覆盖?@Deadpool是的,请参阅Himly的。但是,如果禁用了重写,并且有两个名称相同的bean,应用程序就不会被构建。
@SpringBootApplication
public class SpringBootApp {
public static void main(String... args) {
new SpringApplicationBuilder(SpringBootApp.class)
.initializers(new ApplicationContextInitializer<GenericApplicationContext>() {
@Override
public void initialize(GenericApplicationContext applicationContext) {
applicationContext.setAllowBeanDefinitionOverriding(false);
}
})
.run(args);
}
}
new SpringApplicationBuilder(SpringBootApp.class)
.initializers((GenericApplicationContext c) -> c.setAllowBeanDefinitionOverriding(false) )
.run(args);