Spring Boot взять интерфейс как реализацию bean-компонента

когда я конфигурирую Spring boot 1.5 с mybatis multi-datasource, классическая ошибка «Параметр 0 конструктора в SimsCardTypeController требовал одного bean-компонента, но было найдено 2: aImpl, A». вот связанные классы:

@RestController
@RequestMapping("/xx")
public class SimsCardTypeController extends RestBase {
    private A simsCardTypeService;
    private HttpServletRequest request;

    @Autowired
    public SimsCardTypeController(A simsCardTypeService, HttpServletRequest request) {
        this.simsCardTypeService = simsCardTypeService;
        this.request = request;
    }
..
}
@Component
public class RestBase {}
interface A{}  
@Service
class AImpl implements A{}

Я не знаю какой-либо возможной конфигурации, ведущей к тому, что Spring принимает A как bean. Как я могу отладить эту ситуацию?

Можете ли вы опубликовать свой полный код за исключением?

Indraneel Bende 29.05.2018 05:25

Я публикую связанные классы и исключения

yuxh 29.05.2018 05:36

Реализуют ли 2 класса интерфейс A?

Indraneel Bende 29.05.2018 05:39

нет, я проверял эту возможность, и исключение упоминает A как bean.

yuxh 29.05.2018 05:43

Можете ли вы опубликовать полный проект на github и поделиться ссылкой на d?

Indraneel Bende 29.05.2018 05:46

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

yuxh 29.05.2018 05:51

это может произойти, если есть 2 класса, реализующие один и тот же интерфейс, и оба управляются Spring.

Indraneel Bende 29.05.2018 05:53

что произойдет, если вы замените simsCardTypeService на aImpl?

Patrick 29.05.2018 08:17
0
8
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это проблема с mybatis scan, mybatis transform A interface to mapper. Я поделюсь советом по устранению подобной проблемы:
1. квалифицируйте странный интерфейс A для bean-компонента, который запрашивает Spring

 @Autowired
 public SimsCardTypeController(@Qualifier(value = "A")A simsCardTypeService, HttpServletRequest request){}

2. Добавьте точку останова в теле, вы можете увидеть, что такое simsCardTypeService. В моем случае это что-то вроде xxMapper, поэтому я могу связать его со сканированием mybatis.

Благодарность

Другие вопросы по теме