Spring @ComponentScan не работает на @Repository - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть хранилище в другом пакете, чем класс конфигурации, поэтому я пометил его как @Repostiory следующим образом:

package test;

@Repository
public interface UserTest extends JpaRepository<User, Long> {
}

Я произвел сканирование компонентов на нем, и оно не сработало:

package com.app;
@SpringBootApplication
@ComponentScan({"test","com.app"})
public class Application extends SpringBootServletInitializer {
}

Исключение: нет подходящего бина типа 'test.UserTest': ожидается как минимум 1 бин, который квалифицируется как кандидат для автопровода.

почему сканирование компонентов не работает в репозитории, если я не добавлю enableJpaRepositories? Я думал, что ComponentScan достаточно


Обновление

, так как некоторые ответы дают решение, я спрашиваю об объяснении, а не о решении. Следующее будет работать даже без проверки компонентов на «тесте»:

SpringBootApplication
@EnableJpaRepositories({"test","com.app"})
public class Application extends SpringBootServletInitializer{
}

Теперь вопрос, почему мне даже нужно использовать компонентcancan в @Repository, когда он не работает? почему в документации @Repository сканируется компонентомcan, когда он не имеет эффекта, а @EnableJpaRepostiories - enoguh?

из документации Spring по проверке компонентов: Указывает, должно ли быть включено автоматическое определение классов, аннотированных @Component @Repository, @Service или @Controller.

@ Репозиторий в моем случае не обнаружен

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Чтобы Spring знал, что DataSource связан с каким репозиторием, вы должны определить его в аннотации @EnableJpaRepositories.

Попробуйте включить репозитории jpa, как показано ниже.

@SpringBootApplication
@ComponentScan({"test","com.app"})
@EnableJpaRepositories("test")
public class Application extends SpringBootServletInitializer {
}

ОБНОВЛЕНИЕ: зачем нужны @EnableJpaRepositories?

@ SpringBootApplication автоматически предоставляет функции следующих аннотаций

@ конфигурации @EnableAutoConfiguration @ ComponentScan

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

У меня есть проекты, в которых достаточно только @SpringBootApplication, если вы не пишете свои собственные вещи.

Надеюсь, вы поняли.

Золотые слова:

Если вы хотите получить максимальную выгоду от функции автоматической настройки весенней загрузки, ожидается, что все ваши пакеты классов будут помещены в основной пакет весенней загрузки (непосредственно в основной пакет или косвенно как подпакеты). .

0 голосов
/ 06 ноября 2018

Я нашел объяснение того, что я делал неправильно. Аннотация @Repository с компонентамиcan не заставит Spring реализовать репозиторий spring jpa. для интерфейсов, которые реализуют хранилище crud, следует использовать enablejparepository.

Теперь @Repository с компонентами может использоваться, когда у вас есть класс репозитория, и у вас есть собственный DAO , а не для репозитория Spring Curd , иначе реализация не будет создана:

@Repository
public class UserTest {


    public List<Object> findById(long l) {

             .......
    }
}
0 голосов
/ 06 ноября 2018

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

 package com.app;
    @SpringBootApplication
    @ComponentScan(basePackages={"test","com.app"})
    @EnableJPARepositories 
    public class Application extends SpringBootServletInitializer {
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...