Не удалось выполнить автоподключение. Компоненты типа "Репозиторий" не найдены

Я использую Spring Data Jpa, это структура моего проекта:

App
  ConfigPackage
    MyConfig
  ServicePackage
    MyService
  RepositoryPackage
    MyRepository

Вот MyRepository:

public interface MyRepository extends JpaRepository<MyEntity, Long> {
}

Вот MyService:

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository; <---here

    ...
}

Вот MyConfig:

@Configuration
@EnableJpaRepositories(
        basePackages = "RepositoryPackage",
        entityManagerFactoryRef = "xxx",
        transactionManagerRef = "xxx"
)
public class MyConfig {
}

Я использую @Autowired для внедрения MyRepository в MyService, но IntelliJ всегда жалуется

Could not autowire. No beans of 'MyRepository' type found

даже если код может компилироваться и успешно работать.

Почему IntelliJ не может распознать, что это не ошибка? Как убрать предупреждение IntelliJ?

Версия IntelliJ: 2018.2.6

Я вижу, что вы правильно используете аннотацию @Service, но используете ли вы аннотацию @Repository для своего класса репозитория? Без этой аннотации вы увидите ошибку при попытке «@Autowire». Это может быть полезно, так как я не вижу, где находится ваш основной класс SpringBootApplication: stackoverflow.com/questions/29221645/…

Brandon 24.01.2019 21:56

Проблема решена этим stackoverflow.com/a/42025703/6690200

xingbin 14.02.2019 04:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
2
14 964
6

Ответы 6

Вы можете объявить:

@SuppressWarnings("SpringJavaAutowiringInspection")

В поле или подавите предупреждение с помощью проверки кода Intellij (щелкните красную лампочку, и вы можете подавить «Автоматическое подключение для класса компонентов» либо для поля, либо для всего класса.

Где я должен разместить эту аннотацию?

xingbin 22.01.2019 13:47

Поместите его над полем. Это должно работать так же хорошо, если вы поместите его поверх класса, но тогда вы будете подавлять предупреждения для всех полей.

AlgorithmFromHell 22.01.2019 13:50

Я пробовал оба .. Не повезло ... Тем не менее предупреждение.

xingbin 22.01.2019 13:51

@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspec‌​tion")

Eugene Kortov 15.04.2021 15:53

Note this is for IntelliJ IDEA 2018.3.3 Ultimate Edition (But should work for other versions too)

Я заметил, что эти ошибки возникают (по крайней мере, в моих проектах), когда конфигурация использует @ComponentScan и, таким образом, загружает другой класс, аннотированный @Configuration. IntelliJ, похоже, не полностью распознает это, что приводит к ошибке/предупреждению:

  1. Щелкните в файловой структуре в верхней папке.
  2. Нажмите F4
  3. Перейти в «Модули»
  4. Выберите модуль, в котором IntelliJ жалуется из списка
  5. Нажмите «Spring».
  6. Нажмите на значок плюса
  7. Выберите конфигурацию, которая обеспечивает ваш xRepository
  8. Сохранять

Спасибо, я попробую. Я не могу понять, почему IntelliJ ошибочно принимает это за ошибку.

xingbin 22.01.2019 13:48

Не повезло, все равно предупреждает...

xingbin 24.01.2019 14:09

@竹杖芒鞋轻胜马 Предоставляет ли меню [alt] + [enter] какие-либо решения? Вы также можете игнорировать эти предупреждения, выбрав Настройки > редактор > Инспекции и отключив их.

Lino 24.01.2019 14:29

Да, это позволило мне добавить @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspec‌​tion"), и предупреждения исчезли. Я не знаю почему...

xingbin 28.01.2019 14:24

Добавление @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspec‌​tion") решило проблему. Но когда я погуглил SpringJavaInjectionPointsAutowiringInspection, я не нашел ни одного документа или официальных документов...

xingbin 28.01.2019 14:41

@竹杖芒鞋轻胜马 Я также нашел этот вопрос: stackoverflow.com/questions/21323309/…, что происходит, когда вы удаляете пружинный аспект в конфигурации вашего проекта и позволяете IntelliJ обнаружить его?

Lino 31.01.2019 08:35

Предупреждение исчезает после удаления аспекта Spring. Хотя, я боюсь, это создаст еще одну проблему, даже если я удалю аннотации для других классов, таких как @Service, IntelliJ теперь не сможет его обнаружить, поэтому это может отключить всю функцию обнаружения IntelliJ...

xingbin 31.01.2019 08:40

@竹杖芒鞋轻胜马 Попробуйте нажать [Сборка], а затем [Перестроить проект] на верхней панели, это иногда заставляет IntelliJ сканировать все, и, как говорится, просто полностью перестройте свой проект.

Lino 31.01.2019 08:42

Кажется, здесь есть решение stackoverflow.com/a/42025703/6690200

xingbin 31.01.2019 08:52

Решение, которое я использовал раньше, использовать @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspec‌​tion"), было предложено IntelliJ после того, как я вошел в [alt] + [enter]. Это работает, но я не буду его использовать, потому что не хочу импортировать эту аннотацию. Я включу плагин spring data, как сказал другой ответ.

xingbin 31.01.2019 09:12

В конфигурации вашей базы данных вы должны объявить свои базовые пакеты:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "postgreEntityManager",
        transactionManagerRef = "postgreTransactionManager",
        basePackages = "fr.lab.test.dao"
)
public class PostGreDBConfig {

Спасибо за ответ. Я сделал это, но все же предупреждение...

xingbin 22.01.2019 13:47

Попробуй :

@Configuration
@ComponentScan(basePackages = {"your repository package}")

Я уже делал это в MyConfig.

xingbin 26.01.2019 05:58

Возможно, у Intellij есть проблемы с именем вашего пакета в аннотации @EnableJpaRepositories. Можете ли вы попробовать поместить эту аннотацию в свой основной класс Spring без определения какого-либо свойства basePackages?

@EnableJpaRepositories(entityManagerFactoryRef = "xxx", transactionManagerRef = "xxx")
@SpringBootApplication
public class FooApplication {

    public static void main(String[] args) {
        SpringApplication.run(FooApplication.class, args);
    }
}

Конечно, ваш основной класс Spring должен быть в корне;

root
  ServicePackage
    MyService
  RepositoryPackage
    MyRepository
  FooApplication <---- main class here

Спасибо за ответ. Использование @Repository может устранить предупреждение, но JpaRepository — это NoRepositoryBean. Я думаю, что это не должно быть аннотировано @Repository. Мой основной класс — App, поэтому я полагаю, что класс репозитория должен быть просканирован.

xingbin 26.01.2019 05:57

@竹杖芒鞋轻胜马 тогда вы можете поместить @EnableJpaRepositories в класс App? Без свойства basePackages? Это разрешит, я надеюсь!

buræquete 26.01.2019 05:58

Вроде не помогает

xingbin 28.01.2019 14:23

@竹杖芒鞋轻胜马 Как насчет добавления аспекта в ваш проект? Из меню Project Structure перейдите в свой проект/модуль и добавьте фасет JPA? пример

buræquete 28.01.2019 14:27

Спасибо, сэр, я уже сделал это. Но IntelliJ, похоже, просто не может его распознать.

xingbin 28.01.2019 14:28

@竹杖芒鞋轻胜马 действительно интересно... Возможно, у вашего интеллекта возникли проблемы, вы пытались выполнить шаги здесь ? В противном случае у меня нет другой идеи, к сожалению :'(

buræquete 28.01.2019 14:32

Еще раз спасибо. Я попробую это завтра.

xingbin 28.01.2019 14:34

@竹杖芒鞋轻胜马 У меня есть один вопрос: когда вы вводите методы в репозиторий, Intellij завершает их? Например, когда вы набираете findBy, он дает предложения?

buræquete 28.01.2019 14:34

Да, это дает мне автозаполнение. Поэтому я почти уверен, что IntelliJ может сканировать репозиторий. И предупреждение не вредит, просто я не люблю предупреждения.

xingbin 28.01.2019 14:36

@竹杖芒鞋轻胜马 да, я понимаю, у меня был именно такой случай, никаких проблем, но надоедливые предупреждения, хотя не знаю, что их остановило...

buræquete 28.01.2019 14:37

@竹杖芒鞋轻胜马 использовать автопроводку через конструкторы? Я думаю, что это заставит эти предупреждения исчезнуть, просто следуйте это Это то, что я сделал, я думаю, что удалил предупреждения.

buræquete 28.01.2019 14:40

Да, я автомонтирую через конструкторы... Хотя предупреждение показывает, вводится ли инъекция в файл или в конструктор..

xingbin 28.01.2019 14:43

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

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