gpt4 book ai didi

java - 当有两个相同名称和不同类的 bean 时,如何通过名称获取正确的 bean

转载 作者:行者123 更新时间:2023-11-30 02:01:50 29 4
gpt4 key购买 nike

我有两颗 Spring Bean 。它们的名称相同,但类别不同。

这是 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;
}
};
}

当我使用下面的代码来获取 bean 时,spring 将抛出异常。但我不明白其中的原因。我认为当我使用 bean 名称和 bean 类来获取它时,spring 会给我正确的 bean。但实际上我错了, Spring 没有给它。

这里是获取bean的代码

private UserTaskCompleter getBean(CompleteUserTaskDTO dto) {
String beanName = dto.getProcessDefinitionKey() + "|" + dto.getActivityId();
return applicationContext.getBean(beanName, UserTaskCompleter.class);
}

这是一个异常(exception)

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)

有人可以告诉我当有两个相同名称和不同类的 bean 时如何通过名称获取正确的 bean。

最佳答案

Himly 引用的答案是,不允许 Spring 创建同名的 bean。它实际上阻止了它启动,因为构建应用程序将会失败。

如果用相同的名称定义了多个bean,则后面定义的bean 将覆盖前面定义的bean。因此,在您的情况下,只有一个名为 approve_sign_up_project_request|Task_1tm7e53 的 bean 将会存在,除非您禁用 bean 定义覆盖。

关于java - 当有两个相同名称和不同类的 bean 时,如何通过名称获取正确的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52575866/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com