Я упаковал все свои сущности приложения и интерфейсы репозитория в одну банку. Репозитории написаны с аннотацией @Repository:
@Repository
public interface InternalUserRepository extends JpaRepository<InternalUser, Long>{
}
Я включил этот файл jar в свое приложение для загрузки Spring и попытался автоматически подключить интерфейс, подобный этому, с контроллера:
@RestController
public class AuthenticationController {
@Autowired
AuthenticationService authenticationService;
@Autowired
InternalUserRepository internalUserRepository;
@GetMapping("/")
public String home() {
return "Hello World!";
}
}
Мой основной класс приложения написан так:
@SpringBootApplication
@EnableJpaRepositories
@ComponentScan("com.cdac.dao.cdacdao.*")
public class CdacAuthenticationMgntApplication {
public static void main(String[] args) {
SpringApplication.run(CdacAuthenticationMgntApplication.class, args);
}
}
Репозиторий не подключается автоматически. Когда я запускаю приложение Spring boor, я получаю следующую ошибку:
***************************
APPLICATION FAILED TO START
***************************
Description:
Field internalUserRepository in
com.cdac.user.cdacauthenticationmgnt.controller.AuthenticationController required a bean of type 'com.cdac.dao.cdacdao.repository.InternalUserRepository' that could not be found.
Action:
Consider defining a bean of type 'com.cdac.dao.cdacdao.repository.InternalUserRepository' in your configuration.
Кто-нибудь пробовал подобную архитектуру вроде этой?
Возможный дубликат Проблема SpringBoot ComponentScan с многомодульным проектом




Насколько я помню, @ComponentScan должен указывать полный путь к пакету, поэтому я думаю, что ваш package.* не работает.
Попробуйте вместо этого использовать типобезопасное сканирование компонентов:
// You refer to your packages of your base project and your module here.
// Choose the class so that their package is cover all child package
@SpringBootApplication(scanBasePackageClasses = {xxx. InternalUserRepository.class, xxx.CdacAuthenticationMgntApplication.class})
@EnableJpaRepositories
// No need to explicit @ComponentScan
public class CdacAuthenticationMgntApplication {
Или вы можете попробовать @EnableJpaRepositories("com.cdac.dao.cdacdao")
В любом случае вы должны выбрать класс в самом внешнем пакете (Spring также попытается найти bean в подпакете этих пакетов сканирования компонентов)
В этом случае вы также можете пропустить @EnableJpaRepositories, потому что это также часть функциональности @SpringBootApplication.
Я действительно этого не знаю. Не могли бы вы дать мне ссылку? Спасибо, что поделились: D
Это делается автоконфигурацией Spring Data: docs.spring.io/spring-boot/docs/current/api/org/springframew ork /…: Once in effect, the auto-configuration is the equivalent of enabling JPA repositories using the EnableJpaRepositories annotation.
Решение будет работать, если мои классы репозитория находятся в одном проекте, то есть в приложении для весенней загрузки, которое я разрабатываю. В моем случае репозитории являются частью внешнего jar-файла, который включен как часть зависимостей. Банку нужно распаковывать?
Вот почему вам нужно сослаться на свой класс репозитория в @ComponentScan или использовать строку пакета.
MạnhQuyếtNguyễn, вы имеете в виду это: @ComponentScan ({"com.cdac.dao.cdacdao", "com.cdac.user.cdacau thenticationmgnt"})
Да. Просто добавьте туда пакет вашего репозитория. Но я рекомендую вам использовать класс, чтобы избежать опечатки
Пробовал Оба пути (С классом и без). Кажется, не работает. Та же ошибка возвращается
Вы пробовали это: @EnableJpaRepositories ("com.cdac.dao.cdacdao")
Ага. такой же выход. Думаю, мне не нужно помещать пакет в @Componentscan, если я использую @EnableJpaRepositories ("<Full Package String>")
Позвольте нам продолжить обсуждение в чате.
Думаю, позже смогу помочь вам через teamview. Теперь мне нужно в аэродром. Но сначала попробуйте вообразить себя, просто нужно объявить правильный пакет в @componentscab.
Хорошо, позвольте мне попробовать дальше. Мы можем наверстать упущенное, когда у вас будет время. Я обновлю здесь, если найду решение
Если ваши репозитории JPA находятся в другом пакете, чем ваш класс приложения Spring Boot, вы должны указать этот пакет в аннотации EnableJpaRepositories, а не Component:
@EnableJpaRepositories("com.cdac.dao.cdacdao")
Пакет, который вы указали на ComponentScan, предназначен для определения классов как обычных компонентов Spring, а не интерфейсов репозитория.
OTOH, ответ Mạnh Quyết Nguyễns намного чище, чем мой.
Аннотация @SpringBootApplication поддерживает все функции Так что конфиг вручную нам не нужен
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
В каком пакете определен интерфейс
InternalUserRepository? Также попробуйте удалить.*в конце отсканированных пакетов ...@ComponentScan("com.cdac.dao.cdacdao")