как получить правильный бин по имени, если у него два одинаковых имени и разные классовые бины - PullRequest
0 голосов
/ 30 сентября 2018

у меня две бобовые.Они имеют одно и то же имя, но класс является другим.

Вот определения бина.

Это первое.

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

И когда я использую приведенный ниже код для получения боба, пружина бросит исключение.Но я не понял причину.Я думаю, что весна даст мне правильный боб, когда я использую имя бина и класс бобов, чтобы получить его.Но на самом деле я ошибаюсь, весна не дала этого.

Вот код для получения боба

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

Вот исключение

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)

Может кто-топодскажите, как получить правильный бин по имени, если у него два одинаковых имени и разные бобы calss.

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Ответ, который цитирует Химли, не позволяет Spring создавать бины с тем же именем.Это фактически предотвращает его запуск, так как сборка приложения завершится неудачей.

Если несколько бинов определены с одним и тем же именем, то определенный позже будет переопределять ранее определенный.В результате в вашем случае будет существовать только один компонент с именем approve_sign_up_project_request|Task_1tm7e53, если вы не отключите переопределение определения компонента.

0 голосов
/ 30 сентября 2018

Я уже понял причину.

При определении двух одинаковых имен и разных типов бобов.Источник выберет последний, который переопределяет другие.

В моем случае есть только один компонент с именем "Approve_sign_up_project_request | Task_1tm7e53" и типом StudentTaskToResponseDataConverter.

Когда я использую имя иТип UserTaskCompleter для получения формы компонента beanFactory
пружина не может его найти, а затем пружина сгенерирует исключение.

Как разрешить пружине создать компонент с тем же именем?

Я нахожуответ от здесь

Вот часть импорта ответа

Вы можете использовать инициализатор при создании приложения 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);

    }
}

Или с Java 8:

new SpringApplicationBuilder(SpringBootApp.class)
    .initializers((GenericApplicationContext c) -> c.setAllowBeanDefinitionOverriding(false) )
    .run(args);
...