Я учусь на проектах других людей и следую коду. После того, как я закончил писать соответствующий код для определенной главы, произошла следующая ошибка.
Could not autowire. There is more than one bean of 'UserBusService' type.
Beans:
userBusService (UserBusService.java)
userBusServiceImpl (UserBusServiceImpl.java)
Конкретная соответствующая отправка gitHub: Вышеуказанная ошибка произошла после моей последней (четвертой) отправки кода.
Код проекта, который я запустил для изучения, был нормальным. Долго проверял, но проблему не нашел. В некоторой информации предлагалось заменить @Autowired на @Resource или использовать @Qualifier, но это не использовалось в ссылочном коде.
Я хотел бы спросить, что пошло не так. Ждем Вашего ответа




Я подозреваю, что ваша @MapperScan аннотация на CommonApp. Согласно документации MyBatis, он создает bean-компонент для каждого интерфейса, который находит в вашем пакете (акцент ниже сделан мной :)
<mybatis:scan/>поддерживает фильтрацию созданных картографов путем указания интерфейса маркера или аннотации. Свойство annotation указывает аннотацию для поиска. Атрибут маркер-интерфейса указывает родительский интерфейс для поиска. Если указаны оба свойства, преобразователи добавляются для интерфейсов, соответствующих любому критерию. По умолчанию эти два свойства имеют значение NULL, поэтому все интерфейсы в заданных базовых пакетах будут загружены как преобразователи.
Я предлагаю вам попробовать заменить @MapperScan("org.example") на @MapperScan("org.example.common.domain.service.user.mapper"), поскольку именно там живет ваш картограф.
Большое спасибо. Это решает вышеуказанную проблему, но когда я вызываю интерфейс входа в систему, серверная часть вылетает с сообщением об ошибке org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): org.example.common.domain.service.user.mapper.UserMapper.findUserByName. Не знаю, связано ли это с настройкой
Я проверил код, связанный с картографом, и не обнаружил никаких расхождений.
Похоже, это должно сработать. У меня есть одно предложение — отказаться от файла сопоставления XML и вместо этого аннотировать метод интерфейса: @Select("select * from sys_user_t where username = #{username}")UserEntity findUserByName(String username);. Другой способ — добавить атрибут parameterType = "String" в XML-элемент вашего сопоставителя, но я не уверен, что это поможет, потому что это должно быть выведено автоматически.
Если тип имеет два объекта, помещенных в контейнер IOC, появится сообщение об ошибке: Существует более одного bean-компонента. Вы можете использовать аннотацию @ Qualifier, чтобы добавить значение @ Qualifier к классу UserBusService, которое является уникальным идентификатором (id) компонента, введенного в контейнер IOC текущим классом.
Отвечает ли это на ваш вопрос?