it-roy-ru.com

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

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

Нет бобов?

enter image description here

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

enter image description here

85
Robbo_UK

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

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

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

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

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

120
Abimbola Esuruoso

Добавьте аннотацию 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

34
mkczyk

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

 enter image description here

20
Natix

Я всегда решаю эту проблему, выполняя следующие действия: ..Настройки> Инспекции> Spring Core> Код, вместо того чтобы перейти от ошибки к предупреждению о серьезности

 enter image description here

13
cristianchiess

Иногда вам необходимо указать, где @ComponentScan должен сканировать компоненты. Вы можете сделать это, передав пакеты в качестве параметра этой аннотации, например:

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

Однако, как уже упоминалось, аннотация @SpringBootApplication заменяет @ComponentScan, поэтому в таких случаях вы должны сделать то же самое: 

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

По крайней мере, в моем случае Intellij перестал жаловаться. 

11
João Matos

Я использую Spring-Boot 2.0 и Intellij 2018.1.1 Ultimate Edition, и я столкнулся с той же проблемой.

Я решил, поместив @EnableAutoConfiguration в основной класс приложения

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

Размещение @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");
    }
}
5
wired00

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

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

 enter image description here

4
Xiao Peng - ZenUML.com

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

3
imal hasaranga perera

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

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

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

@SuppressWarnings("SpringJavaAutowiringInspection")
2
Miguel Ángel Medina Aguilar

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

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

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

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

2
sfwn

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

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

2
Tomáš Záluský

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

@ContextConfiguration(classes = {...})
2
K. Gol

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

1
Farkas Archie Bako

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

@ComponentScan
public class PriceWatchTest{

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

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

1
Smart Coder

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

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

1
Jensen Buck

Это можно решить, поместив @EnableAutoConfiguration в основной класс приложения весенней загрузки. 

1
Nirbhay Rana

Иногда - в моем случае это - причина неправильного импорта. Я случайно ввез 

import org.jvnet.hk2.annotations.Service

вместо 

import org.springframework.stereotype.Service

слепо принимая первый выбор в предложенном Идеей импорте. В первый раз это заняло у меня несколько минут :-)

0
Christoph Grimmer-Dietrich

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

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

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

SpringApplicationContext:

  • ExampleApplication.Java
  • MissingBeanClass.Java

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

0
U.V.

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

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


import ...

@Service
class ServiceX {

  ...

}
0
Jöcker

Удивительно, но ориентированный на Feign проект, который успешно работал с Eclipse, не мог работать в InteliJ. При запуске приложения InteliJ пожаловался на клиента Feign, который я пытался внедрить в слой serviceImpl, сказав: поле personRestClient (мой клиент Feign) в ... требуется компонент типа ... который не может быть найден. Попробуйте определить bean-компонент типа «....» в вашей конфигурации.

Я потратил много времени, пытаясь понять, что не так. Я нашел решение (для InteliJ), которое я не совсем понимаю:

  1. Alt Shift F10 (или запустить меню)
  2. Выберите «Изменить конфигурацию»
  3. В окне конфигурации установите флажок «включать зависимости с« предоставленной »областью действия».
  4. Запустите ваше приложение

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

0
ylev