Не удается автоматически подключить репозиторий из внешнего Jar-файла в приложение Spring Boot

Я упаковал все свои сущности приложения и интерфейсы репозитория в одну банку. Репозитории написаны с аннотацией @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.

Кто-нибудь пробовал подобную архитектуру вроде этой?

В каком пакете определен интерфейс InternalUserRepository? Также попробуйте удалить .* в конце отсканированных пакетов ... @ComponentScan("com.cdac.dao.cdacdao")

ptomli 08.05.2018 12:13

Возможный дубликат Проблема SpringBoot ComponentScan с многомодульным проектом

Herr Derb 08.05.2018 12:16
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
2
3 876
3

Ответы 3

Насколько я помню, @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.

dunni 08.05.2018 12:17

Я действительно этого не знаю. Не могли бы вы дать мне ссылку? Спасибо, что поделились: D

Mạnh Quyết Nguyễn 08.05.2018 12:19

Это делается автоконфигурацией 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.

dunni 08.05.2018 12:20

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

deDishari 08.05.2018 12:47

Вот почему вам нужно сослаться на свой класс репозитория в @ComponentScan или использовать строку пакета.

Mạnh Quyết Nguyễn 08.05.2018 12:48

MạnhQuyếtNguyễn, вы имеете в виду это: @ComponentScan ({"com.cdac.dao.cdacdao", "com.cdac.user.cdacau‌ thenticationmgnt"})

deDishari 08.05.2018 12:52

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

Mạnh Quyết Nguyễn 08.05.2018 12:54

Пробовал Оба пути (С классом и без). Кажется, не работает. Та же ошибка возвращается

deDishari 08.05.2018 12:56

Вы пробовали это: @EnableJpaRepositories ("com.cdac.dao.cdacdao")

Mạnh Quyết Nguyễn 08.05.2018 12:57

Ага. такой же выход. Думаю, мне не нужно помещать пакет в @Componentscan, если я использую @EnableJpaRepositories ("<Full Package String>")

deDishari 08.05.2018 13:01

Позвольте нам продолжить обсуждение в чате.

deDishari 08.05.2018 13:04

Думаю, позже смогу помочь вам через teamview. Теперь мне нужно в аэродром. Но сначала попробуйте вообразить себя, просто нужно объявить правильный пакет в @componentscab.

Mạnh Quyết Nguyễn 08.05.2018 13:06

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

deDishari 08.05.2018 13:29

Если ваши репозитории JPA находятся в другом пакете, чем ваш класс приложения Spring Boot, вы должны указать этот пакет в аннотации EnableJpaRepositories, а не Component:

@EnableJpaRepositories("com.cdac.dao.cdacdao")

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

OTOH, ответ Mạnh Quyết Nguyễns намного чище, чем мой.

dunni 08.05.2018 12:17

Аннотация @SpringBootApplication поддерживает все функции Так что конфиг вручную нам не нужен

@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

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