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


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.


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


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


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.


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


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{
/**/
}

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.


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");
    }
}

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


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


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.)


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


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 {

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".


@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 = {...})

hanya untuk paket uji!
Iakov Senatov

2

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

@SuppressWarnings("SpringJavaAutowiringInspection")

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 ...


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!


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!


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.


1

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

@ComponentScan
public class PriceWatchTest{

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

1

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


1

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


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 :-)


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 :)


0

Periksa apakah paket kacang Anda ditulis dengan benar

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


import ...

@Service
class ServiceX {

  ...

}


0

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


0

sederhana kamu harus melakukan 2 langkah

  1. tambahkan hibernate-core depandency
  2. ubah @Autowired ke @Resource.
==>> change @Autowired to  @Resource

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


Ini sama dengan jawaban UV
Anton Bondarenko
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.