Java 当有两个相同的名称和不同的类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定义

这是第一个

@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);