intellij неправильно говорит, что bean-компоненты типа не найдены для автоматического подключения хранилища

138

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

Нет бобов?

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

Как вы можете видеть ниже, он проходит тест? Так что это должно быть Autowired?

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

Robbo_UK
источник
3
IntelliJ иногда выдает ложноположительные ошибки автопровода. Например, в приложениях Spring Boot, где большая часть конфигурации скрыта за EnableAutoConfiguration. Для этого существует открытый вопрос. Другая причина может быть неправильно настроена Spring Facet. Что я обычно делаю в таких ситуациях, так это снижая строгость проверки, чтобы она была менее навязчивой ...
Богуслав Бургхардт

Ответы:

177

У меня была такая же проблема при создании приложения Spring Boot с использованием их @SpringBootApplicationаннотации. Это примечание представляет @Configuration, @EnableAutoConfigurationи в @ComponentScanсоответствии с ссылкой пружинной .

Как и ожидалось, новая аннотация работала правильно, и мое приложение работало нормально, но Intellij продолжал жаловаться на невыполненные @Autowireзависимости. Как только я вернулся к использованию @Configuration, @EnableAutoConfigurationи по @ComponentScanотдельности ошибки прекратились. Похоже, что Intellij 14.0.3 (и, скорее всего, более ранние версии) еще не настроен на распознавание @SpringBootApplicationаннотации.

А пока, если ошибки вас так сильно беспокоят, вернитесь к этим трем отдельным аннотациям. В противном случае игнорируйте Intellij ... ваше разрешение зависимостей правильно настроено, поскольку ваш тест пройден .

Всегда помни...

Человек всегда больше машины.

Abimbola Esuruoso
источник
1
Теперь проблема исправлена ​​в более новых версиях Intellij (проверено на 2017.1)
Sourabh
45
Я все еще получаю его с 2017.2, и это заплаченная за окончательную лицензию.
Томас Карлайл,
1
Я получаю его с помощью внешнего класса 2017.2 и SprintBootTest и статического внутреннего класса SpringBootApplication в соответствии с примером тестирования Spring Cloud Stream: docs.spring.io/spring-cloud-stream/docs/current/reference/html/…
danebez
4
Для более поздних версий IntelliJ (например, 2017) вы должны включить плагин Spring Data, и тогда вам не нужны какие-либо из указанных выше обходных путей. Ниже есть другой ответ, который говорит вам, как это сделать.
Норберт
4
С IntelliJ 2018.2, с использованием Spring Boot 2.0.5, и @SpringBootApplicationя получил эту ошибку. Я следовал совету @ Jaõs Matos, используя scanBasePackagesпараметр @SpringBootApplicationи указав пакет / пространства имен, которые следует сканировать.
Дэйв Гудчайлд
53

Добавьте аннотацию Spring @Repositoryнад классом хранилища.

Я знаю, что это должно работать без этой аннотации. Но если вы добавите это, IntelliJ не покажет ошибку.

@Repository
public interface YourRepository ...
...

Если вы используете Spring Data с расширяющим Repositoryклассом, это будет конфликтным языком. Тогда вы должны указать простоту pagkages.

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

mkczyk
источник
3
Согласно этому youtrack.jetbrains.com/issue/IDEA-148113 это исправлено в версии 16 ... (задерживает дыхание)
ismoore999
@ Компонент также, кажется, работает. Похоже, нужно просто сканировать интерфейс / класс
Бретт,
Вам не нужно больше добавлять @Repository. Просто на плагине Spring Data.
Шин Ким
3
Три года спустя и снова сломался
garyM
Я использовал / @ Mapper для моего интерфейса mapper (mybatis). ИДЕЯ брось это предупреждение. Я изменил его на / @ Репозиторий, предупреждение исчезло.
Бзуо
32

Моя версия IntelliJ IDEA Ultimate (2016.3.4 Build 163), кажется, поддерживает это. Хитрость в том, что вам нужно включить плагин Spring Data.

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

Natix
источник
Это исправило проблему и для меня - кажется, что это может быть реальной проблемой для любого, у кого иначе правильно настроен код!
Матсу 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> Код, чем переход от ошибки к предупреждению о серьезности

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

cristianchiess
источник
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 в своем классе обслуживания, это было для меня.

yankae
источник
5

Ввод @Componentили @configurationв ваш файл конфигурации bean, кажется, работает, то есть что-то вроде:

@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");
    }
}
wired00
источник
4

Если вы не хотите вносить какие-либо изменения в свой код, просто чтобы порадовать IDE. Я решил это, добавив все компоненты к фасету Spring.

  1. Создайте группу с именем «Сервис, Процессоры и Маршрутизаторы» или любым другим именем.
  2. Удалите и заново создайте «Контекст приложения Spring», используя созданную ранее группу в качестве родительского.

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

Сяо Пэн - ZenUML.com
источник
4

Пока ваши тесты проходят, вы в порядке, нажмите alt + enterкурсор на ошибку и в подменю первого элемента, который вы найдете, Disable Inspectionвыберите, что

Имал Хасаранга Перера
источник
Спасибо. Кстати, есть ли способ увидеть все сделанные изменения, которые не являются настройками по умолчанию, в настройках IntelliJ (так что вы знаете, что вы изменили)?
powder366
3

У меня была похожая проблема в приложении Spring Boot. Приложение использует Feign (запросы клиента HTTP-синтеза от аннотированных интерфейсов). После SomeClientаннотирования интерфейса @FeignClientFeign генерирует прокси-класс времени выполнения, реализующий этот интерфейс. Когда какой-либо компонент Spring пытается автоматически связать bean-компонент типа SomeClient, Idea жалуется, что bean-компонент типа не 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
Йозеф Рейхардт,
3

Настройте контекст приложения, и все будет хорошо.

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

Араик Арутюнян
источник
2

И еще одна важная информация - добавьте, ComponentScanчтобы приложение знало о том, что ему нужно подключить. Это не относится к данному вопросу. Однако, если не @autowiringвыполняется вообще, то это, вероятно, ваше решение.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {
HankCa
источник
Это имеет смысл и сделало свое дело для меня. Зачем отключать предупреждения? Предупреждения должны работать как положено!
WebComer
2

Что вам нужно сделать, это добавить

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

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

такой как "package/include/your/annotation/component/deeper/config".

sfwn
источник
@ComponentScan ("package.include.your.annotation.component")!
Яков Сенатов
2

У меня была похожая проблема в моем приложении. При добавлении аннотации некорректная подсветка исчезла.

@ContextConfiguration(classes = {...})
К. Гол
источник
только для тестовых пакетов!
Яков Сенатов
2

Я использую эту аннотацию, чтобы скрыть эту ошибку, когда она появляется в IntelliJ v.14:

@SuppressWarnings("SpringJavaAutowiringInspection")
Мигель Анхель Медина Агилар
источник
Когда он автоматически подключен к конструктору, это@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Лорен
2

Для меня решение заключалось в том, чтобы поместить его @EnableAutoConfigurationв класс Application, @SpringBootApplicationчтобы он подчеркивал его, потому что он избыточен. Удалите его и вуаля все ваши предупреждения о пропавших бобов исчезли! Глупая весна ...

Фаркас Арчи Бако
источник
2

в моем случае, каталог, который я пытался @Autowired, был не на том же уровне,

после настройки на том же уровне структуры ошибка исчезла

надеюсь, что это может помочь кому-то!

Davel_AG
источник
1

Мое решение этой проблемы в моем весеннем загрузочном приложении состояло в том, чтобы открыть контекст весеннего приложения и вручную добавить класс для отсутствующего автонастроенного компонента!

(доступ через меню «Структура проекта» или окно инструмента Spring ... редактировать «Контекст приложения Spring»)

Таким образом, вместо SpringApplicationContext, просто содержащего мою конфигурацию Spring для ExampleApplication, он также содержит отсутствующий компонент:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: сообщение об ошибке исчезло!

ультрафиолетовый
источник
1

Кажется, это все еще ошибка в последней версии IntelliJ и связана с возможной проблемой кэширования?

Если вы добавите аннотацию @Repository как mk321, упомянутую выше, сохраните, затем удалите аннотацию и сохраните снова, это решит проблему.

Дженсен Бак
источник
1

Все, что вам нужно сделать, чтобы сделать эту работу, это следующий код:

@ComponentScan
public class PriceWatchTest{

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}
olammy
источник
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. Запустите ваше приложение

Или выберите Затмение :)

ylev
источник
0

Проверьте правильность написания пакета вашего компонента

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


import ...

@Service
class ServiceX {

  ...

}
Jocker
источник
0

Используйте @AutoConfigureMockMvc для тестового класса.

Харшад Томбаре
источник
0

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

Snkpty
источник
0

просто вы должны сделать 2 шага

  1. добавить hibernate-core depandency
  2. измените @Autowired на @Resource.
==>> change @Autowired to  @Resource
Эр.Рк Ядав
источник
Поясните свой ответ.
менталлург
0

IntelliJ IDEA Ultimate

Добавьте ваш основной класс в контекст приложения IntelliJ Spring, например Application.java

File -> Project Structure..

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

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

Антон Бондаренко
источник
Это равно УФ ответу
Антон Бондаренко