IntelliJ IDEA показывает ошибки при использовании аннотации Spring @Autowired

102

IntelliJ IDEA показывает ошибки, когда я использую @Autowiredаннотацию Spring в классе, но класс работает без проблем.

Вот это сообщение об ошибке:

Члены с автоматическим подключением должны быть определены в допустимом компоненте Spring (@ Component / @ Service и т. Д.) Less ... (Ctrl + F1) Проверяет проблемы с автоматическим подключением в классе bean-компонента.

Вайнлых
источник
5
попробуйте использовать это: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob
У меня такая же ошибка для классов тестирования интеграции. Я думаю, что использование аннотации @SupressWarnings - хорошее решение.
Кевин Виттек
Intellij 2016.2 делает это с моим проектом данных spring boot / spring. Какой файл просматривает Intellij, чтобы выяснить, какие существуют beans?
Адам
2
Мне пришлось использовать @SuppressWarnings ("SpringJavaAutowiredMembersInspection")
user672009
3
Для IntelliJ IDEA 2017.3.1 (Ultimate Edition) используйте@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Ответы:

31

У меня была такая же проблема с IntelliJ IDEA 13.1.4. Я решил ее, удалив аспект Spring (Файл-> Структура проекта) и оставив его только для отображения «Обнаружение».

Хосе Леон
источник
36
Но что, если вы действительно забудете аннотировать bean-компонент. Вы не получите предупреждения?
Cleankod
22

Если вы знаете, что bean-компонент существует, и это всего лишь проблема проверок, просто добавьте следующее перед объявлением переменной:

@SuppressWarnings("SpringJavaAutowiringInspection")
@Inject MyClass myVariable;

Иногда IntelliJ не может разрешить, если был объявлен компонент, например, когда компонент включен условно, а разрешение условия происходит во время выполнения.

Lanoxx
источник
22

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

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....
user3580264
источник
19

Тут такая же ошибка!

Кажется, Intellij не может проверить, является ли реализация класса @Service или @Component.

Решите его, просто изменив значение с ошибки на предупреждение (нажатие Alt + Enter).

Тьяго Перейра
источник
18

Удалите файл .iml из всех модулей вашего проекта и затем перейдите в File -> Invalidate Caches / Restart.

Мацей
источник
9
Удаление аспектов и подавление предупреждений или подобных «исправлений» не казалось логичным или умным, поэтому я решил попробовать. Но последний шаг я сделал иначе. Вместо этого я удалил свой .imlфайл, выбрал реимпорт в Maven опций на pom.xmlфайл, и сделал , ctrl + sчтобы регенерировать .iml. Ошибок больше нет.
ChiefTwoPencils
13

Файл -> ProjectStructure -> Модули -> + (в центральной колонке) -> Spring -> OK

Алексей Самойлов
источник
какая центральная колонна?
Калдип Ядав,
5

У меня такая же проблема. Я решил это, добавив аспект Spring (Файл-> Структура проекта) для каждого соответствующего модуля, а затем добавив файлы конфигурации. Для некоторых проектов (spring mvc) файлы конфигурации обнаруживаются автоматически. Однако для проекта jar мне пришлось добавить файлы конфигурации вручную.

Джбаррамеда
источник
4

Убедитесь, что у вас есть правильные определения компонентов Spring. Иногда приложение работает нормально, оно просто отображает ошибку в IDE, проверьте файл iml вашего проекта, если у вас определен аспект Spring.

я-боб
источник
Также проверьте свой application-properties.xml. Убедитесь, что контекст строки: component-scan base-package = ”com.my.project” не исключает пакет службы, на которую вы ссылаетесь.
i-bob
Я поместил ваш код в файл «bec-job.iml» своего проекта, но проблема все еще существует. И я не могу найти в моем проекте имя файла «applicationContext-interface.xml», можете ли вы рассказать об этом подробнее ?
Vainlyh
вы должны поместить @SuppressWarnings ("SpringJavaAutowiringInspection") прямо над частью вашего кода @Autowired, которая выделена красным. Таким образом IntelliJIdea распознает, какое предупреждение следует подавить.
i-bob
вы должны найти файл «application-properties.xml», а не «applicationContext-interface.xml»
i-bob
1
Этот @SuppressWarnings ("SpringJavaAutowiringInspection") мне кажется хакерским, но он работает. Спасибо, парни.
Минрас
3

Решили проблему, перейдя в Файл >> Структура проекта >> Фасеты, а затем добавив все файлы конфигурации в Spring Facet. После этого он начал обнаруживать файлы, в которых находятся bean-компоненты, и смог отсортировать проблему. IntelliJ, предоставляющий эту проверку, весьма ценен, и ИМХО не следует отключать.

Tomcyjohn
источник
Я не считаю весну возможным аспектом. Какая у вас версия Intellij?
jDub9 04
2

Похоже на проблему видимости - родительский контроллер не видит Компонент, который вы пытаетесь подключить.

Попробуй добавить

@ComponentScan("path to respective Component") 

к родительскому контроллеру.

Евгений Карасев
источник
2

Убедитесь, что ваша идея IntelliJ Idea (IDE) осведомлена обо всех необходимых конфигурациях пружин, на соответствие которым проверяется ваш модуль.

Вы можете проверить это в

Файл> Структура проекта> Модули> [название вашего проекта на правой панели]> Spring

Иногда нам нужно явно указать IDE, что конфигурация Spring исходит из зависимости (jar, присутствующий в пути к классам вашего проекта)

Вивекмор
источник
1
это доступно в версии для сообщества или только в окончательной версии?
Архимед
1

У меня та же проблема. Моя причина заключалась в том, что bean-компонент, содержащий ссылку с автоматическим подключением, не был компонентом Spring (это был EJB), но имел перехватчик SpringBeanAutowiringInterceptor, позволяющий использовать автоматическое подключение. Я думаю, что Intellij не учитывает эту возможность при проверке Autowiring.

Teocali
источник
1

У меня тоже была эта пробема. Выполнение alt+, enterа затем запрос либо перезапустить, либо отключить проверку Spring на затронутой строке, исправило это. Это стало проблемой только после обновления 13.4.

Джейсон Д
источник
1

в моем случае мне не хватало записи в web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:applicationContext.xml</param-value>
   </context-param>

и в файле контекста приложения:

<context:component-scan base-package=[your package name] />

после добавления этих тегов и запуска maven для перестройки проекта ошибка autowired в intellj исчезает, и в левом поле появляется значок bean-компонента: введите описание изображения здесь

демиан
источник
1

Моя - за то, что я не добавляю @Repository в мой интерфейс CrudRepository, учебник, который я смотрел, не добавлял его в STS и не жаловался.

Реджиндери
источник
1

Вы должны проверить, есть ли у вас @Component, @Repository или аналогичный добавленный в класс

Милош Николик
источник
0

Я решил это, добавив веб-аспект.

Павел Власов
источник
0
eg1:
directorSettings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class 
operate:checkout 勾去掉
eg2:
1.impl class add @service
like this:
@Service
public class CityServiceImpl implements CityService{
@Autowired
private CityDao cityDao;

like this
2.dao file class add @Repository
@Repository
public interface CityDao {
Ли
источник
0

Вот так я решил эту проблему. В IntelliJ все ваши пакеты должны быть в дополнительном пакете, который является дополнительным пакетом main / java. Например, я поместил все свои пакеты в src / main / java / com.misisol.watchStore /, и spring может найти мои beans после этого.

Мехрдад Шарифи
источник
0

Inject Bean с @Qualifier решил проблему для меня.

Понлеу
источник
0

У меня была аналогичная проблема. Я решил это, сняв флажок «Обрабатывать явно аннотированные beans» (см. Снимок экрана ниже). Эта опция включена по умолчанию в Linux. Теперь видны аннотации @Service и @Configurations. Скриншот

Александр Буржец
источник
0

немного поздно, но я надеюсь, что это поможет кому-то другому.

Обязательно поместите @Service в класс реализации для службы

@Service
public class ServiceNameImpl implements ServiceName {

    @Override
    public void method(ObjectType paramName) {
        //CODE
    }

}

Вот как я исправил ошибку.

Мар Вильнёв
источник
0

Я знаю, что это старый вопрос, но я не нашел ответов, которые решали бы эту проблему для меня, поэтому я предоставлю свое решение.

Примечание: я думал, что проблема могла быть в этом , но моя проблема не была связана с реализацией одного и того же интерфейса дважды. С помощью@Qualitier действительно решило мою проблему, но это была повязка, а не подходящее решение, поэтому я не соглашался с этим.

ЗАДНИЙ ПЛАН

Мне поручено поддерживать старый проект, который прошел через разные версии spring и обновлялся только для отдельных модулей, поэтому, мягко говоря, потребовался рефакторинг. Изначально у меня возникла проблема с дублированием bean, и, когда я возился с вещами, проблема менялась между проблемой OP и проблемой дублированного bean, даже если был только один bean; переход к повторяющимся bean-компонентам всегда происходил в одном классе.

ПРОБЛЕМА

Проблема присутствовала в @Repositoryклассе, который был @Autowiredв @Serviceклассе, который также имел @ComponentScanаннотацию. Я заметил, что у меня также была пружина, application-config.xmlкотораяcontext:component-scan Spring, который базовый пакет, что, как мне кажется, было оригинальным подходом в более старых версиях Spring. Я был в процессе создания новой ветки, взяв части старой ветки и новой ветки в проекте поддержки, который использовался в различных проектах, которые разрабатывались в течение нескольких лет, и поэтому было такое сочетание и совпадение методологий.

ПРОСТОЕ РЕШЕНИЕ

Поскольку более современный подход к использованию @ComponentScanуже был реализован, я просто удалил, application-config.xmlи проблема была решена.

Даррел Холт
источник
0

У меня сработало следующее:

  1. Найдите все классы, реализующие службу (интерфейс), которая выдает ошибку.
  2. Отметьте каждый из этих классов аннотацией @Service, чтобы обозначить их как классы бизнес-логики.
  3. Восстановите проект.
тондераймучада
источник
0

Я мог бы немного опоздать, но после того, как потратил часы на изучение этого вопроса.

Я обнаружил, что в последней версии IntelliJ 2020 @AutoWired является необязательным, а внедрение зависимостей на основе конструктора предпочтительнее.

Я решил проблему, просто удалив аннотацию @AutoWired из класса службы и контроллера и использовав инъекцию зависимостей на основе конструктора.

Эта ссылка может помочь.

Удачного кодирования!

Шарик Шейх
источник
0

У меня была эта проблема только с одной службой с инъекцией зависимостей на основе конструктора с версией IntelliJ 2019.2.4. Я счел полезным изменить имя службы (shift + f6), а затем отменить изменения с уровня git.

Водзоо
источник