IntelliJ IDEA показывает ошибки при использовании аннотации @Autowired Spring
IntelliJ IDEA показывает ошибки, когда я использую Spring @Autowired
аннотации в классе, но класс функционирует без каких-либо проблем.
Вот это сообщение об ошибке:
Элементы с автопроводкой должны быть определены в действительном пружинном компоненте (@Component/@Service и т. Д.) Минус... (Ctrl+F1) Проверяет проблемы с автопроводкой в классе компонента.
33 ответа
Я исправил это, добавив предупреждение о подавлении:
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
@Autowired
private ....
У меня была та же проблема с IntelliJ IDEA 13.1.4. Я решил ее, удалив фасет Spring (File->Project Structure) и оставив его только для отображения "Detection".
Если вы знаете, что бин существует и это просто проблема проверок, то просто добавьте следующее перед объявлением переменной:
@SuppressWarnings("SpringJavaAutowiringInspection")
@Inject MyClass myVariable;
Иногда IntelliJ не может разрешить, если компонент был объявлен, например, когда компонент включен условно и разрешение условия происходит во время выполнения.
Получил ту же ошибку здесь!
Кажется, Intellij не может проверить, является ли реализация класса @Service или @Component.
Решите это, просто переключаясь с ошибки на предупреждение (нажав Alt + Enter).
Удалите файл.iml из всех модулей вашего проекта, а затем перейдите в меню "Файл" -> "Запретить кэширование / перезапустить".
Файл -> ProjectStructure -> Модули -> +(в центральном столбце) -> Spring ->OK
У меня такая же проблема.
И я думаю, что правильный способ исправить это - сказать Intellij, чтобы он нашел правильный контекст Spring, а не «подавить предупреждение».
Короче говоря, File -> ProjectStructure(⌘;) -> Modules -> (выберите модуль) -> Spring -> (нажмите '+', чтобы добавить контекст) -> OK
Добавьте файл контекста:
сделано!
У меня такая же проблема. Я решил это, добавив фасет Spring (File->Project Structure) для каждого соответствующего модуля, а затем добавив файлы конфигурации. Для некоторых проектов (spring mvc) конфигурационные файлы обнаруживаются автоматически. Однако для проекта jar мне пришлось добавить файлы конфигурации вручную.
Я мог бы немного опоздать, но после нескольких часов изучения этого вопроса.
Я обнаружил, что в последней версии IntelliJ 2020 @AutoWired является необязательным, а внедрение зависимостей на основе конструктора предпочтительнее.
Я решил проблему, просто удалив аннотацию @AutoWired из класса Service и Controller и используя внедрение зависимостей на основе конструктора.
Эта ссылка может помочь.
Удачного кодирования!
Решил проблему, выбрав Файл >> Структура проекта >> Фасеты, а затем добавив все файлы конфигурации в Spring Facet. После этого он начал обнаруживать файлы, в которых находятся компоненты, и смог решить проблему. IntelliJ дает эту проверку довольно ценно, и IMHO не должен быть отключен.
Убедитесь, что у вас есть правильные определения bean-компонента Spring. Иногда приложение работает нормально, оно просто отображает ошибку в IDE, проверьте файл iml вашего проекта, если у вас определен фасет Spring.
Подавление запахов предупреждений может не сработать, поскольку предупреждение может указывать на то, что экземпляр не был внедрен, т. е. имеет значение null.
Если вы используете Spring Boot:
- Что мне помогло, так это аннотировать мой тестовый класс с помощью @SpringBootTest(ClassName.class), где <ClassName> заменяется именем тестируемого класса.
- Аннотация работает путем создания ApplicationContext, который будет использоваться в тесте, тем самым распознавая аннотацию @autowired.
У меня тоже была эта пробема. Выполнение alt+enter, а затем с просьбой либо перезапустить, либо отключить проверку Spring на произведенной строке, исправили ее. Это только кажется, стало проблемой после обновления 13.4.
Похоже, проблема видимости - родительский контроллер не видит компонент, который вы пытаетесь подключить.
Попробуй добавить
@ComponentScan("path to respective Component")
на родительский контроллер.
У меня та же проблема. Моя причина в том, что bean-компонент, содержащий ссылку на автопроводку, не был компонентом Spring (это был EJB), но получил перехватчик SpringBeanAutowiringInterceptor, позволяющий использовать автопроводку. Я думаю, что Intellij не использует эту возможность в своей инспекции Autowiring.
Убедитесь, что ваша IntelliJ Idea (IDE) знает обо всех необходимых конфигурациях пружин, с которыми проверяется ваш модуль.
Вы можете проверить это в
Файл> Структура проекта> Модули> [название вашего проекта на правой панели] > Spring
Иногда нам нужно явно сообщить IDE, что весенняя конфигурация исходит из зависимости (jar присутствует в classpath вашего проекта)
В моем случае мне не хватало, чтобы написать в 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 desapears, а слева отображается значок компонента:
Мой предназначен для того, чтобы не добавлять @Repository в мой интерфейс CrudRepository, учебник, который я смотрел, не добавил его на STS и не жаловался.
Вы должны проверить, есть ли у вас @Component, @Repository или аналогичные добавленные в классе
Для меня сработало следующее:
- Найдите все классы, реализующие службу (интерфейс), которая выдает ошибку.
- Отметьте каждый из этих классов аннотацией @Service, чтобы обозначить их как классы бизнес-логики.
- Восстановите проект.
Поместите эти две аннотации поверх класса модульного теста:
@SpringBootTest
@ExtendWith(SpringExtension.class)
class VerificationServiceTest {
@Autowired
private VerificationService service;
@Test
void matchUserBiometric() {
service. // some method / property
}
}
эта ошибка появляется из-за того, что в контейнере Spring нет экземпляра вашего класса обслуживания, поэтому, по сути, когда вы пытаетесь запустить тест, появляется нулевая точка, вам нужно инициализировать Spring, и тогда экземпляр вашего класса будет доступен .
Немного поздно, но я надеюсь, что это поможет кому-то еще.
Обязательно поместите @Service в класс реализации для службы
@Service
public class ServiceNameImpl implements ServiceName {
@Override
public void method(ObjectType paramName) {
//CODE
}
}
Вот так я исправил ошибку.
Я знаю, что это старый вопрос, но я не нашел ответов, которые решали бы эту проблему для меня, поэтому я предоставлю свое решение.
Примечание: я думал, что проблема могла быть в этом, но моя проблема не была связана с реализацией одного и того же интерфейса дважды. С помощью@Qualitier
действительно решила мою проблему, но это была повязка, а не подходящее решение, поэтому я не соглашался с этим.
ЗАДНИЙ ПЛАН
Мне поручено поддерживать старый проект, который прошел через разные версии spring и обновлялся только для отдельных модулей, поэтому, мягко говоря, потребовался рефакторинг. Изначально у меня возникла проблема с дублированием bean, и, когда я возился с вещами, проблема менялась между проблемой OP и проблемой дублированного bean, хотя был только один bean; переход к дублированным bean-компонентам всегда переходил к одному и тому же классу.
ПРОБЛЕМА
Проблема присутствовала на @Repository
класс, который был @Autowired
в @Service
класс, который также имел @ComponentScan
аннотация. Заметил, что у меня тоже пружинаapplication-config.xml
что делал context:component-scan
в базовом пакете, который, как я считаю, был оригинальным подходом в более старых версиях Spring. Я был в процессе создания новой ветки, взяв части старой ветки и новой ветки в проекте поддержки, который использовался в различных проектах, которые разрабатывались в течение нескольких лет, и поэтому было такое сочетание и совпадение методологий.
ПРОСТОЕ РЕШЕНИЕ
Поскольку более современный подход к использованию @ComponentScan
уже реализовано, я просто удалил application-config.xml
и проблема была решена.
Для тех, кто использует IDEA, вы можете просто удалить те предупреждения, которые вам известны.
В Mac переместите проклятие на красную волновую линию, нажмите option + enter (alt+ enter в Windows), вы увидите предложения:
Попробуйте их, и вы увидите автоматически добавленные
SuppressWarnings
Помнить,
option+enter
всегда дают хорошие решения.
У меня была эта проблема только с одной службой с инъекцией зависимостей на основе конструктора с версией IntelliJ 2019.2.4. Я счел полезным изменить имя службы (shift + f6), а затем отменить изменения с уровня git.
Я решил эту проблему таким образом. В IntelliJ все ваши пакеты должны быть в подпакете, который является подпакетом main/java. Например, я поместил все свои пакеты в src/main/java/com.misisol.watchStore/, и Spring мог найти мои бины потом.
У меня была похожая проблема. Я решил эту проблему, сняв флажок "Обрабатывать явно аннотированные компоненты" (см. Скриншот ниже). Эта опция включена по умолчанию в Linux. Теперь аннотации @Service и @Configurations видны. Скриншот
eg1:
director:Settings - 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 {
Отображаемая ошибка относится к случаям, когда вы пытаетесь@Autowire
действительный в класс, который сам по себе не является допустимым Spring@Bean
.
СНАЧАЛА убедитесь, что класс, в который вы пытаетесь автоматически подключить компонент, является допустимым компонентом Spring, аннотируя его соответствующим стереотипом Spring: или его специализацией, например@Controller
,@Repository
, или@Service
. Согласно документации Spring Framework (см. здесь) класс, помеченный тегом@Component
или любая его специализация:
[...] рассматриваются как кандидаты на автоматическое обнаружение при использовании конфигурации на основе аннотаций и сканирования пути к классам.
В некоторых случаях может случиться так, что плагин IntelliJ Spring не сможет разрешить дерево зависимостей. Если вы уверены, что все портит IDE, вы можете попробовать:
- Удалить
.idea
папку в локальном репозитории, затем перейдите вFile -> Invalidate Caches
и перезагрузите проект