IntelliJ IDEA показує помилки при використанні анотації Spring @Autowired Spring


102

IntelliJ IDEA показує помилки, коли я використовую @Autowiredанотацію Spring на уроці, але клас функціонує без проблем.

Ось це повідомлення про помилку:

Автоматичні члени повинні бути визначені у дійсній навесні (@ Component / @ Service тощо) менше ... (Ctrl + F1) Перевіряє проблеми з автоматичним підключенням у класі бобів.


5
спробуйте скористатися цим: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob

У мене однакова помилка для моїх тестових класів інтеграції. Я думаю, що використання анотації @SupressWarnings - це приємне рішення.
Кевін Віттек

Intellij 2016.2 робить це з моїм проектом Spring / boot data. Який файл переглядає Intellij, щоб з’ясувати, які боби існують?
Адам

2
Мені довелося користуватися @SuppressWarnings ("SpringJavaAutowiredMembersInspection")
користувач672009

3
Для використання IntelliJ IDEA 2017.3.1 (Ultimate Edition)@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Відповіді:


31

У мене була така ж проблема з IntelliJ IDEA 13.1.4. Я вирішив її, видаливши весну фасети (Файл-> Структура проекту) і залишивши її просто показати "Виявлення".


36
Але що робити, якщо ви насправді забули коментувати бобові. Ви не отримаєте жодного попередження?
Клеанк

22

Якщо ви знаєте, що квасоля існує і це лише проблема перевірок, то просто додайте наступне перед оголошенням змінної:

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

Іноді IntelliJ не може вирішити, якщо bean був оголошений, наприклад, коли bean включений умовно і розв'язання умови відбувається під час виконання.


21

Я виправив це, додавши попередження про припинення:

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....

19

Тут є та сама помилка!

Здається, Intellij не може перевірити, чи реалізація класу є @Service або @Component.

Вирішіть це, просто змінившись з помилки на попередження (натискаючи Alt + Enter).


18

Видаліть .iml файл із усіх модулів проекту та перейдіть до Файл -> Недійсний кеш / Перезапуск


9
Видалення граней та придушення попереджень чи подібних "виправлень" не здавалося логічним чи розумним, тому я дав цьому спробувати. Але я не робив останнього кроку так само. Натомість я видалив свій .imlфайл, вирішив повторно імпортувати параметри pom.xmlфайлу Maven у файлі та зробив ctrl + sрегенерацію .iml. Помилки пішли.
ChiefTwoPencils


5

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


4

Переконайтеся, що ви правильно визначили свої весняні боби. Іноді програма працює добре, вона просто відображає помилку в IDE, перевірте файл "iml" проекту, якщо у вас визначена грань Spring.


Також перевірте свою програму-properties.xml. Перевірте, чи контекст рядка: компонент-сканування 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. Після цього він почав виявляти файли, в яких перебуває квасоля, і вдалося сортувати проблему. IntelliJ, що дає цей чек, є досить цінним, і IMHO не слід відключати.


Я не бачу Весни як можливого аспекту. Яку версію Intellij у вас є?
jDub9

2

Схоже, проблема з видимістю - батьківський контролер не бачить компонент, який ви намагаєтеся з'єднати.

Спробуйте додати

@ComponentScan("path to respective Component") 

до батьківського контролера.


2

Переконайтесь, що ваш IntelliJ Idea (IDE) знає про всі необхідні пружинні конфігурації, проти яких перевіряється ваш модуль.

Ви можете перевірити це під

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

Іноді нам потрібно чітко сказати IDE, що пружинна конфігурація виходить із залежності (баночка, присутня на вашому проектному класі)


1
це доступно у виданні спільноти чи це лише на кінцевому рахунку?
Архімед Траяно

1

У мене така ж проблема. Моє було тому, що боб, що містить посилання на автоматичне з'єднання, не був компонентом Spring (це був EJB), але отримав перехоплювач SpringBeanAutowiringInterceptor, що дозволяє використовувати автопровід. Я думаю, що Intellij не сприймає такої можливості під час перевірки Автомобільної мережі.


1

У мене теж була ця проблема. Виконання alt+, enterа потім прохання або повторно запустити, або відключити весільну перевірку за виконаною лінією. Це, здається, стало проблемою після оновлення 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 для відновлення проекту помилка з автоматичним проводом у програмі intellj зменшується, а піктограма квасолі з’являється у лівій частині поля: введіть тут опис зображення


1

Моє не для додавання @Repository в мій інтерфейс CrudRepository, підручник, який я дивився, не додав його на STS, і він не скаржився.




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 /, і весна могла знайти мої боби потім.



0

У мене була подібна проблема. Я вирішив це, знявши позначку "Обробити явно помічені боби" (див. Скріншот нижче). Ця опція включена за замовчуванням у Linux. Тепер видно примітки @Service та @Configurations. скріншот


0

трохи пізно, але я сподіваюся, що це допоможе комусь іншому.

Не забудьте поставити @Service на клас реалізації для сервісу

@Service
public class ServiceNameImpl implements ServiceName {

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

}

Ось як я виправив помилку.


0

Я знаю, що це старе питання, але я не натрапив на жоден відповідь, який би вирішив цю проблему для мене, тому я запропоную своє рішення.

Примітка. Я думав, що проблема могла бути такою , але моя проблема не була пов'язана із впровадженням одного і того ж інтерфейсу двічі. Використання @Qualitierзмусило мою проблему піти, але це була пов'язка, а не правильне рішення, тому я з цим не погодився.

Передумови

Мені доводиться підтримувати старий проект, який пережив різні версії весни та оновив лише окремі модулі, тому, щонайменше, потрібен рефакторинг. Я спочатку отримав дублікат випуску бобів, і поводячись з речами, змінив питання вперед і назад між випуском ОП та дублюючим бобом, хоча був лише один боб; навігація до дублюючих бобів завжди йшла до одного класу.

ПИТАННЯ

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

ПРОСТЕ РІШЕННЯ

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


0

Для мене працювало наступне:

  1. Знайдіть усі класи, що реалізують послугу (інтерфейс), яка видає помилку.
  2. Позначте кожен із цих класів за допомогою примітки @Service, щоб вказати їх як класи бізнес-логіки.
  3. Побудуйте проект.

0

Я можу трохи запізнитися, але витративши години і досліджуючи це питання.

Я з’ясував, що в останній версії IntelliJ 2020 @AutoWired є необов'язковою, і інжектор на основі конструктора є кращим.

Я вирішив проблему, просто видаливши анотацію @AutoWired з класу Service and Controller та використовуючи введення залежності від конструктора на основі конструктора.

Це посилання може допомогти.

Щасливе кодування!


0

У мене була ця проблема лише з однією службою з інжекцією залежності від конструктора з 2019.2.4 версією IntelliJ. Мені було корисно змінити назву послуги (shift + f6), а потім відмінити зміни від рівня git.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.