Использование аннотации @Autowired для интерфейса при загрузке Spring - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть интерфейс (QBuilder), и есть два класса (MBuilder, TBuilder), реализующих этот интерфейс.Интерфейс содержит метод тестирования.Этот метод получает тип параметра MCubeInfo в MBuilder и TCubeInfo в TBuilder.

public interface QBuilder<T> {

    public String test(T cubeInfo);
}

public class MBuilder implements QBuilder<MCubeInfo> {

    @Override
    public String test(MCubeInfo cubeInfo) {
        System.out.println("MCube Info");
        return "MCube";
    }
}


public class TBuilder implements QBuilder<TCubeInfo> {
        @Override
        public String test(TCubeInfo cubeInfo) {
            System.out.println("TCube Info");
            return "TCube";
        }
}

Я ожидаю, что когда я вызываю тестовый метод в QuerySvc, qBuilder перенаправляет меня в соответствии с типом параметра.Тем не менее, в QWuilder с автоматическим подключением устанавливается автоматически с MBuilder.Поэтому, когда я отправляю объект TCubeInfo в тестовую функцию, возникает ошибка, что он не может быть преобразован MCubeInfo.

@RestController
public class QuerySvc {

     private QBuilder qBuilder;

     @Autowired
     public void setQBuilder(QBuilder q){
          qBuilder = q)
     }

     @RequestMapping(value = "/boot", method = RequestMethod.GET)
     public ResponseEntity<String> getTest(){

           .
           .
           .
           TCubeInfo cube = .....
           qBuilder.test(cube);

     }


}

При поиске проблемы я столкнулся с аннотацией @Qualifier, но не могу адаптировать ее к своемупроблема.

1 Ответ

0 голосов
/ 06 февраля 2019

Я думаю, вам следует создать два разных bean-компонента из этих двух классов Service / Component, которые вы определили.

public class MBuilder   //two different beans in configuration Class.
public class Tuilder 

Spring-boot Configuration Class.

@Bean(name="mBuilder") //define bean name
public MBuilder mBuilder(){    //mBuilder bean for MBuilder Class.
    return new MBuilder();
}

@Bean(name="tBuilder")   //Define bean name
public TBuilder tBuilder(){   //tBuilder bean for TBuilder Class.
    return new TBuilder();
}

Теперь, в вашем RestController попробуйте ввести два компонента с другим оператором @Qualifier.Как показано ниже.

Класс RestController.

@RestController
public class QuerySvc {

     @Qualifier("tBuilder")  //Now use tBuilder Object as per Your Need.
     @Autowired
     private QBuilder tBuilder;
     @Qualifier("mBuilder") // You can use mBuilder Object as per need.
     @Autowired 
     private QBuilder mBuilder;

     @Autowired
     public void setQBuilder(QBuilder q){
          qBuilder = q)
     }

     @RequestMapping(value = "/boot", method = RequestMethod.GET)
     public ResponseEntity<String> getTest(){

           .
           .
           .
           TCubeInfo cube = .....
           qBuilder.test(cube);
     }
}

Примечание : - Здесь вы использовали обобщенные типизированные параметры, которые разрешаются при компиляцииТолько времяЗдесь TCubeInfo и MCubeInfo оба являются разными классами (они не находятся в иерархии отношений).Таким образом, невозможно разыграть объект, который не попадает под иерархию.Это повысит ClassCastException.

...