Intellij неправильно сказав, що для автоматичного провідникового сховища не знайдено бобів типу


138

Я створив простий модульний тест, але IntelliJ неправильно виділяє його червоним кольором. позначаючи це як помилку

Ні квасолі?

введіть тут опис зображення

Як ви бачите нижче, він проходить тест? Так воно повинно бути автоматичним?

введіть тут опис зображення


3
IntelliJ іноді дає помилкові позитивні помилки автопроводу. Наприклад, у програмах Spring Boot, де багато конфігурації приховано за EnableAutoConfiguration. Для цього є відкрите питання. Іншою причиною може бути неправильно налаштована грань весни. Те, що я зазвичай роблю в цих ситуаціях, - це зменшення строгості перевірки, щоб воно було менш нав'язливим ...
Богуслав Бургхардт

Відповіді:


177

У мене була ця сама проблема при створенні програми Spring Boot, використовуючи їх @SpringBootApplicationанотацію. Ця анотація являє собою @Configuration, @EnableAutoConfigurationі @ComponentScanзгідно з джерелом посилання .

Як і очікувалося, нова анотація спрацювала належним чином, і моя програма працювала безперебійно, але Intellij продовжував скаржитися на невиконані @Autowireзалежності. Як тільки я перейшов до використання @Configuration, @EnableAutoConfigurationі @ComponentScanокремо помилки припинилися. Здається, Intellij 14.0.3 (і, швидше за все, і більш ранні версії) ще не налаштований для розпізнавання @SpringBootApplicationпримітки.

Поки, якщо помилки вас так сильно турбують, поверніться до цих трьох окремих приміток. В іншому випадку ігноруйте Intellij ... ваша роздільна здатність налаштована правильно, оскільки ваш тест проходить.

Завжди пам'ятай...

Людина завжди більша за машину.


1
Виправлення виправлено тепер із новішими версіями Intellij (перевірено 2017.1)
Sourabh

45
Я все ще отримую це з 2017.2, і це оплачена остаточна ліцензія.
Томас Карлайл

1
Я отримую це з 2017.2 та зовнішнього класу SprintBootTest та статичного внутрішнього класу SpringBootApplication за
danebez

4
Для більш пізніх версій IntelliJ (наприклад, 2017 р.) Ви повинні увімкнути плагін Spring Data і тоді вам не потрібен жоден із перерахованих вище обхідних завдань. Нижче є ще одна відповідь, яка говорить вам, як це зробити.
Норберт

4
У IntelliJ 2018.2, використовуючи Spring Boot 2.0.5, @SpringBootApplicationя отримував цю помилку. Я дотримувався поради @ Jaõs Matos, використовуючи scanBasePackagesпараметр для @SpringBootApplicationта вказав пробіли пакунків / імен, які слід сканувати.
Дейв Гудчільд

53

Додайте весняну примітку @Repositoryнад класом сховища.

Я знаю, що це має працювати без цієї примітки. Але якщо додати це, IntelliJ не покаже помилки.

@Repository
public interface YourRepository ...
...

Якщо ви використовуєте Spring Data з розширенням Repositoryкласу, це будуть конфліктні повідомлення. Тоді ви повинні вказати на чіткі сторінки.

import org.springframework.data.repository.Repository;
...

@org.springframework.stereotype.Repository
public interface YourRepository extends Repository<YourClass, Long> {
    ...
}

А далі ви можете автоматично з'єднати своє сховище без помилок.

@Autowired
YourRepository yourRepository;

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

Можливо, у новій версії IntelliJ можна виправити: https://youtrack.jetbrains.com/issue/IDEA-137023


3
Відповідно до цього youtrack.jetbrains.com/issue/IDEA-148113 він зафіксований у версії 16 ... (затримує дихання)
ismoore999

@Component також, здається, працює. Схоже, одному потрібно змусити сканувати інтерфейс / клас
Бретт

Вам більше не потрібно додавати @Repository. Просто на плагіні Spring Data.
Шин Кім

3
Через три роки, і це знову порушено
garyM

Я використовував / @ Mapper для свого картографічного інтерфейсу (mybatis). IDEA кидає це попередження. Я змінив його на / @ Repository, попередження пропало.
bzuo

32

Моя версія IntelliJ IDEA Ultimate (2016.3.4 Build 163), схоже, підтримує це. Хитрість полягає в тому, що вам потрібно увімкнути плагін Spring Data.

введіть тут опис зображення


Це вирішило і для мене проблему. Здається, це може бути справжньою проблемою для тих, хто в іншому випадку правильно встановить код!
Мацу Q.

5
Не працює у 2017 році.2.7. Плагін увімкнено, але попередження все ще існує.
заморожений мозок

Працював для мене в iJ Ultimate 2018.2.5.
JL_SO

23

Іноді вам потрібно вказати, де @ComponentScan повинен шукати компоненти. Це можна зробити, передавши пакети як параметр цієї анотації, наприклад:

@ComponentScan(basePackages={"path.to.my.components","path.to.my.othercomponents"})

Однак, як уже згадувалося, анотація @SpringBootApplication замінює @ComponentScan, отже, у таких випадках потрібно робити те саме:

@SpringBootApplication(scanBasePackages={"path.to.my.components","path.to.my.othercomponents"})

Принаймні в моєму випадку Intellij перестав скаржитися.


2
Це, безумовно, краще, чистіше рішення, і це може підтвердити, що це усунуло попередження. Дякую!
Дейв Гудчільд

2
У моєму випадку я мав, @SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) і хоча програма працювала нормально, Intellij це не сподобалось. Зміна на @SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})фіксовану для мене!
GriffoGoes

1
Це, безумовно, найкраще рішення, оскільки він портативний між IDE і чітко повідомляє про наміри розробника.
MusikPolice

Я використовую ultimate 2019.3.1 весняний черевик 2.2.1 та java 11.0.4. Проблема все ще існує в одиничних тестових файлах.
garyM

1
Що запропонував @GriffoGoes вирішив мою проблему, оскільки я перебирав структуру мульти модулів, це було моїм найкращим рішенням
Хуан Монсальве

20

Я завжди вирішую цю проблему, виконуючи наступні дії. Налаштування> Інспекції> Spring Core> Код, ніж ви переходите від помилки до попередження про параметр суворості

введіть тут опис зображення


2
Я пішов з цим рішенням, поки не буде зроблено виправлення на Spring: youtrack.jetbrains.com/issue/IDEA-182912
Гаррі Поллі

15

Я використовую Spring-boot 2.0 та intellij 2018.1.1 ultimate edition, і я зіткнувся з тим же питанням.

Я вирішив, розмістивши @EnableAutoConfiguration в основному класі додатків

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}

13
Це також "працює" для мене, але тоді Intellij скаржиться: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Майкл

6

Перевірте, чи ви пропустили примітку @Service у своєму сервісному класі, це було для мене.


5

Введення @Componentабо @configurationв файлі конфігурації боб , здається, працює, тобто що - щось на кшталт:

@Configuration
public class MyApplicationContext {
    @Bean
    public DirectoryScanner scanner() {
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    }
}

@Component
public class MyApplicationContext {
    @Bean
    public DirectoryScanner scanner() {
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    }
}

4

Якщо ви не хочете вносити будь-які зміни в код, просто щоб зробити ваш IDE щасливим. Я вирішив це, додавши до компонента Spring всі компоненти.

  1. Створіть групу з назвою "Сервіс, процесори та маршрутизатори" або будь-яке ім'я;
  2. Видаліть і відтворіть "Весняний контекст програми", використовуйте групу, яку ви створили раніше як батьків.

введіть тут опис зображення


4

Поки ваші тести проходять, ви добрі, натиснувши alt + enterкурсор на помилку і всередині підменю першого елемента ви знайдете, що Disable Inspectionвиберіть


Дякую. До речі, чи є спосіб побачити всі внесені зміни, які не є типовими для одного перегляду в Налаштуваннях IntelliJ (щоб ви знали, що ви змінили)?
порошок366

3

У мене була подібна проблема у програмі Spring Boot. У додатку використовується Feign (HTTP-клієнт, який синтезує запити з анотованих інтерфейсів). Маючи інтерфейс з SomeClientанотацією @FeignClient, Feign генерує клас проксі-сервера, що реалізує цей інтерфейс. Коли якийсь компонент Spring намагається автоматично надати з'єднання типу bean SomeClient, Idea скаржиться на відсутність бобів типуSomeClient знайдено оскільки в проекті насправді не існує реального класу, і Idea не навчена розуміти@FeignClient анотацію жодним чином.

Рішення: анотувати інтерфейс SomeClientз @Component. (У нашому випадку ми не використовуємо @FeignClientанотацію SomeClientбезпосередньо, а скоріше використовуємо метаанотацію, @OurProjectFeignClientяку анотуємо , @FeignClientа також додавання @Componentанотації до неї працює.)


Так, додавання @Componentдо інтерфейсу вирішує проблему. Але я думаю, що це не правильний спосіб ... На мою думку, це помилка в IntelliJ IDEA або бути не таким вже й жорстким IntelliJ IDEA не готовий до нових версій Feign. Це працює без більш @Componentерлі-файльних версій (де замість цього @FeignClientбуло анотацію - можливо, це і є причиною проблеми). Ви знайшли будь-які інші деталі (можливо, квиток про помилку) для цього? org.springframework.cloud.netflix.feignorg.springframework.cloud.openfeign
Йозеф Рейхардт

Ні, я не маю, хоча мій випадок (який не працював без нього @Component) @FeignClientвід org.springframework.cloud.netflix.feignпакета.
Томаш Залускі

3
Випуск у програмі відслідковування помилок JetBrains знаходиться тут: youtrack.jetbrains.com/issue/IDEA-168155
Йозеф Рейхардт


2

І остання важлива інформація - додайте ComponentScanтак, щоб програма знала про речі, які їй потрібні. У випадку цього питання це не актуально. Однак якщо взагалі нічого @autowiringне виконується, це, швидше за все, ваше рішення.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {

Це має сенс і зробило для мене трюк. Чому вимкнути попередження? Попередження повинні працювати як очікувалося!
WebComer

2

Що вам потрібно зробити, це додати

@ComponentScan("package/include/your/annotation/component") в AppConfiguration.java.

Оскільки я думаю AppConfiguraion.java, що пакет вашого пакета глибший, ніж пакунок компонента (@Service, @Component ...),

таких як "package/include/your/annotation/component/deeper/config".


@ComponentScan ("package.include.your.annotation.component")!
Іаков Сенатов

2

У моїй заявці була схожа проблема. Коли я додав анотації, зникли невірні маркування.

@ContextConfiguration(classes = {...})

тільки для тестових пакетів!
Іаков Сенатов

2

Я використовую цю примітку, щоб приховати цю помилку, коли вона з’являється в IntelliJ v.14:

@SuppressWarnings("SpringJavaAutowiringInspection")

Після автоматичного підключення до конструктора це@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Лорен

2

Для мене рішенням було розміщення @EnableAutoConfigurationв класі Application під @SpringBootApplicationйого підкресленням, оскільки його надмірність. Видаліть його і проголосуйте всі попередження щодо відсутніх бобів! Дурна весна ...


2

у моєму випадку Каталог, який я намагався @Autowired, не був на одному рівні,

після налаштування на одному рівні структури помилка зникла

сподіваюся, що це може допомогти комусь!


1

Моє рішення цієї проблеми в моєму додатку для весняного завантаження полягало в тому, щоб відкрити контекст весняного додатка та додати клас для відсутнього автопровідного боба вручну!

(доступ через меню Структура проекту або вікно інструмента весни ... редагувати "Весняний контекст програми")

Тож замість SpringApplicationContext, що містить мою пружинну конфігурацію ExampleApplication, він також містить відсутніх Bean:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: Повідомлення про помилку зникло!


1

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

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


1

Все, що вам потрібно зробити, щоб зробити цю роботу - це наступний код:

@ComponentScan
public class PriceWatchTest{

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}

1

Мені просто довелося використовувати @EnableAutoConfiguration для його вирішення, однак ця помилка не мала функціонального впливу.


1

Це можна вирішити, помістивши @EnableAutoConfiguration на основний клас додатка для завантаження.


0

Іноді - в моєму випадку це - причина - неправильний імпорт. Я випадково імпортував

import org.jvnet.hk2.annotations.Service

замість

import org.springframework.stereotype.Service

сліпо прийнявши перший вибір у запропонованому Ідеєю імпорті. Забрав мене кілька хвилин у перший раз, коли це сталося :-)


0

Дивно, але проект, орієнтований на Feign, який успішно працював із Eclipse, не міг працювати в InteliJ. Коли запустив програму, InteliJ поскаржився на клієнта Feign, який я намагався ввести в рівень serviceImpl, кажучи: польовий personRestClient (мій клієнт Feign) у ... вимагав типу bean ... Подумайте про те, щоб у своїй конфігурації визначити тип "....".

Я даремно даремно намагався зрозуміти, що не так. Я знайшов рішення (для InteliJ), яке я не повністю розумію:

  1. Alt Shift F10 (або запустити меню)
  2. Виберіть "Змінити конфігурацію"
  3. У вікні конфігурації поставте прапорець "включати залежності із" наданим "областю"
  4. Запустіть свою програму

Або виберіть Eclipse :)


0

Перевірте, чи правильно написана упаковка вашого квасолі

//Check if this is written right 
package com.package1.package2.package3


import ...

@Service
class ServiceX {

  ...

}


0

Я вирішив проблему, встановивши плагін mybatis в IDEA. Коли я встановив плагін Mybatis, він зник.


0

просто, ви повинні зробити 2 кроки

  1. додайте сплячку в основу сплячки
  2. змінити @Autowired на @Resource.
==>> change @Autowired to  @Resource

Поясніть свою відповідь.
mentallurg

0

IntelliJ IDEA Ultimate

Додайте свій основний клас до контексту Spring IntelliJ Spring Application, наприклад Application.java

File -> Project Structure..

ліва сторона: Налаштування проекту -> Модулі

права сторона: знайдіть у вашій структурі пакета Springі додайте+ Application.java


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