intellij secara keliru mengatakan tidak ada jenis kacang yang ditemukan untuk repositori yang diotomatiskan

138

Saya telah membuat unit test sederhana tetapi IntelliJ salah menyorotnya merah. menandainya sebagai kesalahan

Tidak kacang?

masukkan deskripsi gambar di sini

Seperti yang Anda lihat di bawah, ia lulus tes? Jadi harus Autowired?

masukkan deskripsi gambar di sini

Robbo_UK
sumber
3
IntelliJ terkadang memberikan kesalahan autowire positif palsu. Misalnya dalam aplikasi Spring Boot di mana banyak konfigurasi disembunyikan di balik EnableAutoConfiguration. Ada masalah terbuka untuk itu. Penyebab lain mungkin tidak tepat dikonfigurasi pada sisi Musim Semi. Apa yang biasanya saya lakukan dalam situasi ini adalah menurunkan keparahan inspeksi sehingga kurang mengganggu ...
Bohuslav Burghardt

Jawaban:

177

Saya memiliki masalah yang sama ketika membuat aplikasi Boot Spring menggunakan @SpringBootApplicationanotasi mereka . Anotasi ini mewakili @Configuration, @EnableAutoConfigurationdan @ComponentScansesuai dengan referensi pegas .

Seperti yang diharapkan, anotasi baru berfungsi dengan baik dan aplikasi saya berjalan dengan lancar tetapi, Intellij terus mengeluh tentang @Autowiredependensi yang tidak terpenuhi . Segera setelah saya berubah kembali untuk menggunakan @Configuration, @EnableAutoConfigurationdan @ComponentScansecara terpisah, kesalahan berhenti. Tampaknya Intellij 14.0.3 (dan kemungkinan besar, versi sebelumnya juga) belum dikonfigurasikan untuk mengenali @SpringBootApplicationanotasi.

Untuk saat ini, jika kesalahannya sangat mengganggu Anda, maka kembalilah ke ketiga anotasi yang terpisah. Jika tidak, abaikan Intellij ... resolusi dependensi Anda telah dikonfigurasikan dengan benar, karena pengujian Anda berlalu.

Selalu ingat...

Manusia selalu lebih besar dari mesin.

Abimbola Esuruoso
sumber
1
Masalah ini telah diperbaiki sekarang dengan versi Intellij yang lebih baru (diperiksa pada 2017.1)
Sourabh
45
Saya masih mendapatkannya dengan 2017.2, dan itu adalah lisensi tertinggi yang dibayarkan.
Thomas Carlisle
1
Saya mendapatkannya dengan 2017.2 dan kelas luar SprintBootTest dan kelas internal statis SpringBootApplication sesuai dengan contoh pengujian Spring Cloud Stream: docs.spring.io/spring-cloud-stream/docs/current/reference/html/…
danebez
4
Untuk versi IntelliJ yang lebih baru (mis. 2017) Anda harus mengaktifkan plugin Spring Data dan kemudian Anda tidak memerlukan solusi di atas. Ada jawaban lain di bawah ini yang memberi tahu Anda cara melakukan itu.
Norbert
4
Dengan IntelliJ 2018.2, menggunakan Spring Boot 2.0.5 dan @SpringBootApplicationsaya menerima kesalahan ini. Saya mengikuti saran dari @ Jaos Matos dengan menggunakan scanBasePackagesparameter untuk @SpringBootApplicationdan menentukan paket / namespaces yang harus dipindai.
Dave Goodchild
53

Tambahkan anotasi Spring di @Repositoryatas kelas repositori.

Saya tahu ini akan berfungsi tanpa anotasi ini. Tetapi jika Anda menambahkan ini, IntelliJ tidak akan menampilkan kesalahan.

@Repository
public interface YourRepository ...
...

Jika Anda menggunakan Spring Data dengan Repositorykelas ekstensi, itu akan menjadi halaman konflik. Maka Anda harus menunjukkan halaman kejelasan.

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

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

Dan selanjutnya Anda dapat secara otomatis menyimpan repositori Anda tanpa kesalahan.

@Autowired
YourRepository yourRepository;

Ini mungkin bukan solusi yang baik (saya kira Anda mencoba mendaftar repositorium dua kali). Tetapi bekerja untuk saya dan jangan menunjukkan kesalahan.

Mungkin di versi baru IntelliJ dapat diperbaiki: https://youtrack.jetbrains.com/issue/IDEA-137023

mkczyk
sumber
3
Menurut youtrack.jetbrains.com/issue/IDEA-148113 ini diperbaiki dalam versi 16 ... (
tahan
@Component juga sepertinya berfungsi. Sepertinya orang hanya perlu memaksa antarmuka / kelas untuk dipindai
Brett
Anda tidak perlu menambahkan @Repository lagi. Hanya pada plugin Spring Data.
Shin Kim
3
Tiga tahun kemudian dan itu rusak lagi
garyM
Saya menggunakan / @ Mapper untuk antarmuka mapper saya (mybatis). IDEA membuang peringatan ini. Saya mengubahnya ke / @ Repositori, peringatan hilang.
bzuo
32

Versi IntelliJ IDEA Ultimate (2016.3.4 Build 163) saya tampaknya mendukung hal ini. Caranya adalah Anda harus mengaktifkan plugin Spring Data.

masukkan deskripsi gambar di sini

Natix
sumber
Ini memperbaiki masalah bagi saya juga - Sepertinya ini mungkin masalah sebenarnya bagi siapa saja yang memiliki pengaturan kode dengan benar!
Matsu Q.
5
Tidak berfungsi di 2017.2.7. Plugin diaktifkan, tetapi peringatan itu masih ada.
brainfrozen
Bekerja untuk saya di iJ Ultimate 2018.2.5.
JL_SO
23

Terkadang Anda diminta untuk menunjukkan di mana @ComponentScan harus memindai komponen. Anda dapat melakukannya dengan mengirimkan paket sebagai parameter anotasi ini, misalnya:

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

Namun, seperti yang telah disebutkan, anotasi @SpringBootApplication menggantikan @ComponentScan, maka dalam hal ini Anda harus melakukan hal yang sama:

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

Setidaknya dalam kasus saya, Intellij berhenti mengeluh.

João Matos
sumber
2
Ini jelas merupakan solusi yang lebih baik dan lebih bersih, dan dapat mengkonfirmasi bahwa ini menghilangkan peringatan. Terima kasih!
Dave Goodchild
2
Dalam kasus saya yang saya miliki @SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) dan meskipun aplikasi bekerja dengan baik, intellij tidak menyukainya. Mengubah untuk @SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})diperbaiki untuk saya!
GriffoGoes
1
Sejauh ini, ini adalah solusi terbaik, karena ini bersifat portable di antara IDE dan secara jelas mengomunikasikan maksud pengembang.
MusikPolice
Saya menggunakan pegas boot utama 2019.3.1 2.2.1 dan java 11.0.4. Masalahnya masih ada di file unit test.
garyM
1
apa yang disarankan @GriffoGoes memperbaiki masalah saya, karena saya menggunakan struktur multi-modul, itu solusi terbaik saya
Juan Monsalve
20

Saya selalu menyelesaikan masalah ini dengan melakukan hal berikut .. Pengaturan> Inspeksi> Pegas Inti> Kode daripada Anda beralih dari kesalahan ke peringatan opsi tingkat permasalahan

masukkan deskripsi gambar di sini

kekristenan
sumber
2
Saya menggunakan solusi ini sampai perbaikan dilakukan pada Spring: youtrack.jetbrains.com/issue/IDEA-182912
Garry Polley
15

Saya menggunakan spring-boot 2.0, dan intellij 2018.1.1 edisi pamungkas dan saya menghadapi masalah yang sama.

Saya dipecahkan dengan menempatkan @EnableAutoConfiguration di kelas aplikasi utama

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}
Kareem
sumber
13
Ini juga "bekerja" untuk saya, tetapi kemudian intellij mengeluh: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Michael
6

Periksa apakah Anda melewatkan anotasi @Service di kelas layanan Anda, itulah yang terjadi pada saya.

yankae
sumber
5

Menempatkan @Componentatau @configurationdalam file konfigurasi kacang Anda tampaknya berfungsi, yaitu sesuatu seperti:

@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
sumber
4

Jika Anda tidak ingin membuat perubahan pada kode Anda hanya untuk membuat IDE Anda senang. Saya telah menyelesaikannya dengan menambahkan semua komponen ke aspek Spring.

  1. Buat grup dengan nama "Layanan, Prosesor dan Router" atau nama apa pun yang Anda suka;
  2. Hapus dan buat ulang "Konteks Aplikasi Musim Semi" menggunakan grup yang Anda buat sebelumnya sebagai orangtua.

masukkan deskripsi gambar di sini

Xiao Peng - ZenUML.com
sumber
4

Selama tes Anda melewati Anda baik, tekan alt + enterdengan mengambil kursor atas kesalahan dan di dalam submenu dari item pertama Anda akan menemukan Disable Inspectionpilih itu

imal hasaranga perera
sumber
Terima kasih. Ngomong-ngomong, apakah ada cara untuk melihat semua perubahan yang dibuat yang tidak default dalam satu tampilan di Pengaturan IntelliJ (jadi Anda tahu apa yang telah Anda ubah)?
powder366
3

Saya memiliki masalah serupa dalam aplikasi Spring Boot. Aplikasi ini menggunakan Feign (permintaan klien sintesis HTTP dari antarmuka beranotasi). Dengan antarmuka yang SomeClientdianotasi @FeignClient, Feign menghasilkan kelas proxy runtime yang mengimplementasikan antarmuka ini. Ketika beberapa komponen Pegas mencoba untuk mengotomatiskan jenis kacang SomeClient, Ide tidak mengeluh kacang jenis yang SomeClientditemukan karena tidak ada kelas nyata yang benar-benar ada dalam proyek dan Ide tidak diajarkan untuk memahami @FeignClientanotasi dengan cara apa pun.

Solusi: antarmuka SomeClientdengan catatan @Component. (Dalam kasus kami, kami tidak menggunakan @FeignClientanotasi SomeClientsecara langsung, kami lebih suka menggunakan metaannotasi @OurProjectFeignClientyang dianotasi @FeignClientdan menambahkan @Componentanotasi agar berfungsi juga.)

Tomáš Záluský
sumber
Ya, menambah @Componentantarmuka menyelesaikan masalah. Tapi saya pikir ini bukan cara yang benar ... Menurut saya ini adalah bug di IntelliJ IDEA atau tidak terlalu sulit IntelliJ IDEA tidak siap untuk versi Feign yang lebih baru. Ia bekerja tanpa @Componentdi versi yang lebih awal (di mana @FeignClientanotasi berada di org.springframework.cloud.netflix.feignbukannya org.springframework.cloud.openfeign- mungkin ini adalah penyebab masalah?). Sudahkah Anda menemukan rincian lebih lanjut (mungkin tiket bug) untuk ini?
Josef Reichardt
Tidak, saya belum, meskipun paket saya (yang tidak berfungsi @Component) berasal @FeignClientdari org.springframework.cloud.netflix.feign) paket.
Tomáš Záluský
3
Masalah di pelacak bug JetBrains ada di sini: youtrack.jetbrains.com/issue/IDEA-168155
Josef Reichardt
3

Konfigurasikan konteks aplikasi dan semuanya akan beres.

masukkan deskripsi gambar di sini

Arayik Harutyunyan
sumber
2

Dan satu informasi penting terakhir - tambahkan ComponentScansehingga aplikasi tahu tentang hal-hal yang perlu disambungkan. Ini tidak relevan dalam kasus pertanyaan ini. Namun jika tidak @autowiringada yang dilakukan sama sekali maka ini kemungkinan solusi Anda.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {
HankCa
sumber
Ini masuk akal dan melakukan trik untuk saya. Mengapa mematikan peringatan? Peringatan harus bekerja seperti yang diharapkan!
WebComer
2

Yang perlu Anda lakukan adalah menambahkan

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

Karena saya pikir AppConfiguraion.javapaket Anda lebih dalam dari komponen anotasi Anda (@Service, @Component ...),

seperti "package/include/your/annotation/component/deeper/config".

sfwn
sumber
@ComponentScan ("package.include.your.annotation.component")!
Iakov Senatov
2

Saya memiliki masalah serupa dalam aplikasi saya. Ketika saya menambahkan anotasi, salah memilih highliting menghilang.

@ContextConfiguration(classes = {...})
K. Gol
sumber
hanya untuk paket uji!
Iakov Senatov
2

Saya menggunakan anotasi ini untuk menyembunyikan kesalahan ini ketika muncul di IntelliJ v.14:

@SuppressWarnings("SpringJavaAutowiringInspection")
Miguel Ángel Medina Aguilar
sumber
Ketika dimasukkan ke dalam sebuah konstruktor@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Loren
2

Bagi saya solusinya adalah menempatkan @EnableAutoConfigurationdi kelas Aplikasi di bawah @SpringBootApplicationyang akan menggarisbawahi karena itu berlebihan. Hapus dan voila semua peringatan Anda tentang kacang yang hilang lenyap! Musim Semi konyol ...

Farkas Archie Bako
sumber
2

dalam Kasus saya, Direktori yang saya coba @Autowired tidak berada pada level yang sama,

setelah mengaturnya pada level struktur yang sama, kesalahan menghilang

Semoga ini bisa membantu seseorang!

Davel_AG
sumber
1

Solusi saya untuk masalah ini dalam aplikasi booting pegas saya adalah membuka konteks aplikasi pegas dan menambahkan kelas untuk kacang autowired yang hilang secara manual!

(akses melalui menu Struktur Proyek atau jendela pegas alat ... sunting "Konteks Aplikasi Pegas")

Jadi alih-alih SpringApplicationContext hanya berisi konfigurasi pegas ExampleApplication saya, ia juga mengandung Bean yang hilang:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: Pesan kesalahannya hilang!

UV
sumber
1

Ini sepertinya masih menjadi bug di IntelliJ terbaru dan ada hubungannya dengan kemungkinan masalah caching?

Jika Anda menambahkan anotasi @Repositori seperti mk321 yang disebutkan di atas, simpan, lalu hapus anotasi dan simpan lagi, ini memperbaiki masalah.

Jensen Buck
sumber
1

Yang perlu Anda lakukan untuk membuat pekerjaan ini adalah kode berikut:

@ComponentScan
public class PriceWatchTest{

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

Saya hanya perlu menggunakan @EnableAutoConfiguration untuk mengatasinya, namun kesalahan ini tidak memiliki dampak fungsional.

Smart Coder
sumber
1

Ini dapat diatasi dengan menempatkan @EnableAutoConfiguration pada kelas utama aplikasi boot spring.

Nirbhay Rana
sumber
0

Terkadang - dalam kasus saya yaitu - alasannya adalah impor yang salah. Saya tidak sengaja mengimpor

import org.jvnet.hk2.annotations.Service

dari pada

import org.springframework.stereotype.Service

dengan secara membabi buta menerima pilihan pertama dalam impor yang disarankan Idea. Butuh waktu beberapa menit saat pertama kali terjadi :-)

Christoph Grimmer-Dietrich
sumber
0

Anehnya, proyek berorientasi A Feign yang berhasil dijalankan dengan Eclipse tidak dapat berjalan di InteliJ. Ketika memulai aplikasi, InteliJ mengeluh tentang klien Feign yang saya coba untuk menyuntikkan ke lapisan serviceImpl yang mengatakan: field personRestClient (klien Feign saya) di ... diperlukan kacang jenis ... yang tidak dapat ditemukan. Pertimbangkan mendefinisikan jenis kacang '....' di konfigurasi Anda.

Saya membuang waktu lama untuk mencoba memahami apa yang salah. Saya menemukan solusi (untuk InteliJ) yang saya tidak sepenuhnya mengerti:

  1. Alt Shift F10 (atau menjalankan menu)
  2. Pilih 'Edit konfigurasi'
  3. Di jendela konfigurasi, Centang kotak centang 'sertakan dependensi dengan cakupan "Disediakan"'
  4. Jalankan aplikasi Anda

Atau pilih Eclipse :)

ylev
sumber
0

Periksa apakah paket kacang Anda ditulis dengan benar

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


import ...

@Service
class ServiceX {

  ...

}
Jöcker
sumber
0

Gunakan @AutoConfigureMockMvc untuk kelas uji.

Harshad Thombare
sumber
0

Saya memecahkan masalah dengan menginstal plugin mybatis di IDEA. Ketika saya menginstal Plugin Mybatis, itu menghilang.

Snkpty
sumber
0

sederhana kamu harus melakukan 2 langkah

  1. tambahkan hibernate-core depandency
  2. ubah @Autowired ke @Resource.
==>> change @Autowired to  @Resource
Er.Rk Yadav
sumber
Jelaskan jawabanmu.
mentallurg
0

IntelliJ IDEA Ultimate

Tambahkan kelas utama Anda ke IntelliJ Spring Application Context, misalnya Application.java

File -> Project Structure..

sisi kiri: Pengaturan Proyek -> Modul

sisi kanan: temukan di struktur paket Anda Springdan tambahkan+ Application.java

Anton Bondarenko
sumber
Ini sama dengan jawaban UV
Anton Bondarenko