IntelliJ IDEA menunjukkan kesalahan saat menggunakan anotasi @Autowired Spring

102

IntelliJ IDEA menunjukkan kesalahan ketika saya menggunakan @Autowiredanotasi Spring di kelas, tetapi kelas berfungsi tanpa masalah.

Inilah pesan kesalahan ini:

Anggota autowired harus didefinisikan dalam spring bean yang valid (@ Component / @ Service, dll.) Less ... (Ctrl + F1) Memeriksa masalah autowiring di kelas bean.

Vainlyh
sumber
5
coba gunakan ini: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob
Saya memiliki kesalahan yang sama untuk kelas pengujian integrasi saya. Saya pikir menggunakan anotasi @SupressWarnings adalah solusi yang bagus.
Kevin Wittek
Intellij 2016.2 melakukan ini dengan proyek data boot musim semi / musim semi saya. File mana yang dicari Intellij untuk memastikan kacang apa yang ada?
Adam
2
Saya harus menggunakan @SuppressWarnings ("SpringJavaAutowiredMembersInspection")
user672009
3
Untuk IntelliJ IDEA 2017.3.1 (Ultimate Edition) gunakan@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Jawaban:

31

Saya memiliki masalah yang sama dengan IntelliJ IDEA 13.1.4 Saya menyelesaikannya dengan menghapus segi Spring (File-> Struktur Proyek) dan membiarkannya hanya menampilkan "Deteksi".

Jose Leon
sumber
36
Tetapi bagaimana jika Anda benar-benar lupa memberi anotasi pada kacang. Anda tidak akan mendapat peringatan?
Cleankod
22

Jika Anda tahu bahwa kacang itu ada dan itu hanya masalah inspeksi, maka tambahkan yang berikut ini sebelum deklarasi variabel:

@SuppressWarnings("SpringJavaAutowiringInspection")
@Inject MyClass myVariable;

Kadang-kadang IntelliJ tidak dapat menyelesaikan jika sebuah kacang telah dideklarasikan, misalnya ketika kacang dimasukkan secara bersyarat dan resolusi kondisi terjadi pada saat runtime.

lanoxx.dll
sumber
21

Saya memperbaikinya dengan menambahkan peringatan supress:

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....
pengguna3580264
sumber
19

Punya kesalahan yang sama di sini!

Tampaknya Intellij tidak dapat memverifikasi apakah implementasi kelas adalah @Service atau @Component.

Selesaikan itu hanya dengan mengubah dari Kesalahan ke Peringatan (Menekan Alt + Enter).

Thiago Pereira
sumber
18

Hapus file .iml dari semua modul proyek Anda dan selanjutnya masuk ke File -> Invalidate Caches / Restart

Maciej
sumber
9
Menghapus faset dan menekan peringatan atau "perbaikan" serupa tampaknya tidak logis atau cerdas, jadi saya mencobanya. Tapi saya tidak melakukan langkah terakhir yang sama. Sebagai gantinya saya menghapus .imlfile saya , memilih untuk mengimpor kembali dalam opsi maven pada pom.xmlfile tersebut, dan melakukan a ctrl + suntuk meregenerasi .iml. Kesalahan hilang.
ChiefTwoPencils
13

File -> ProjectStructure -> Modules -> + (di kolom tengah) -> Spring -> OK

Aleksey Samoylov
sumber
kolom tengah yang mana?
Kuldeep Yadav
5

Saya memiliki masalah yang sama. Saya menyelesaikannya dengan menambahkan facet Spring (File-> Project Structure) untuk setiap modul yang relevan, dan kemudian menambahkan file konfigurasi. Untuk beberapa proyek (pegas mvc), file konfigurasi terdeteksi secara otomatis. Namun, untuk proyek jar, saya harus menambahkan file konfigurasi secara manual.

jbarrameda.dll
sumber
4

Pastikan definisi Spring bean Anda benar. Kadang-kadang, aplikasi berfungsi dengan baik, itu hanya menampilkan kesalahan di IDE, periksa file 'iml' proyek Anda jika Anda telah menentukan segi Spring.

i-bob
sumber
Periksa juga application-properties.xml Anda. Periksa apakah konteks baris: component-scan base-package = "com.my.project" tidak mengecualikan paket layanan yang Anda rujuk.
i-bob
Saya memasukkan kode Anda ke dalam "bec-job.iml" proyek saya, tetapi masalahnya masih ada. Dan saya tidak dapat menemukan nama file "applicationContext-interface.xml" dalam proyek saya, dapatkah Anda menceritakannya secara detail ?
Vainlyh
Anda harus meletakkan @SuppressWarnings ("SpringJavaAutowiringInspection") tepat di atas bagian @Autowired pada kode Anda yang disorot merah. Dengan cara ini IntelliJIdea mengenali peringatan mana yang harus ditekan.
i-bob
Anda harus menemukan file "application-properties.xml", bukan "applicationContext-interface.xml"
i-bob
1
@SuppressWarnings ("SpringJavaAutowiringInspection") itu tampak hacky bagi saya, tetapi berhasil. Terima kasih teman-teman.
Minras
3

Selesaikan masalah dengan membuka File >> Struktur Proyek >> Aspek dan kemudian menambahkan semua file konfigurasi ke Spring Facet. Setelah itu mulai mendeteksi file tempat kacang berada dan dapat mengurutkan masalah. IntelliJ memberikan cek ini cukup berharga dan IMHO tidak boleh dinonaktifkan.

tomcyjohn
sumber
Saya tidak melihat Spring sebagai Facet yang mungkin. Versi Intellij apa yang Anda miliki?
jDub9
2

Sepertinya masalah visibilitas - pengontrol induk tidak melihat Komponen yang Anda coba sambungkan.

Coba tambahkan

@ComponentScan("path to respective Component") 

ke pengontrol induk.

Eugene Karasev
sumber
2

Pastikan IntelliJ Idea (IDE) Anda mengetahui semua konfigurasi pegas yang diperlukan yang menjadi tempat pemeriksaan modul Anda.

Anda dapat memeriksanya di bawah

File> Project Structure> Modules> [nama proyek Anda di panel kanan]> Spring

Terkadang, kami perlu memberi tahu IDE secara eksplisit bahwa konfigurasi pegas berasal dari dependensi (jar ada di classpath project Anda)

vivekmore
sumber
1
apakah ini tersedia di edisi komunitas atau hanya di ultimate?
Archimedes Trajano
1

Saya punya masalah yang sama. Milik saya adalah karena kacang yang berisi referensi autowired bukanlah komponen Spring (itu adalah EJB), tetapi mendapat Interceptor SpringBeanAutowiringInterceptor yang memungkinkan penggunaan autowiring. Saya pikir Intellij tidak mengambil kemungkinan ini dalam inspeksi Autowiring-nya.

Teocali
sumber
1

Saya punya masalah ini juga. Melakukan alt+ enterdan kemudian meminta untuk menjalankan kembali atau menonaktifkan pemeriksaan Pegas pada saluran yang terkena, memperbaikinya. Ini sepertinya hanya menjadi masalah setelah pembaruan 13.4.

Jason D
sumber
1

dalam kasus saya, saya tidak dapat menulis di web.xml:

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>

   <context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:applicationContext.xml</param-value>
   </context-param>

dan dalam file konteks aplikasi:

<context:component-scan base-package=[your package name] />

setelah menambahkan tag ini dan menjalankan maven untuk membangun kembali proyek kesalahan autowired di intellj desapears dan ikon kacang muncul di margin kiri: masukkan deskripsi gambar di sini

demian
sumber
1

Milik saya adalah karena tidak menambahkan @Repository pada antarmuka CrudRepository saya, tutorial yang saya tonton tidak menambahkannya di STS dan tidak mengeluh.

Rejinderi
sumber
1

Anda harus memeriksa apakah Anda memiliki @Component, @Repository atau yang serupa ditambahkan di kelas

Milos Nikolik
sumber
0

Saya menyelesaikannya dengan menambahkan aspek Web.

Pavel Vlasov
sumber
0
eg1:
directorSettings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class 
operate:checkout 勾去掉
eg2:
1.impl class add @service
like this:
@Service
public class CityServiceImpl implements CityService{
@Autowired
private CityDao cityDao;

like this
2.dao file class add @Repository
@Repository
public interface CityDao {
lee
sumber
0

Saya telah memecahkan masalah ini dengan cara ini. Di IntelliJ semua paket Anda harus berada dalam sub paket yang merupakan sub paket main / java. Misalnya saya telah meletakkan semua paket saya di bawah src / main / java / com.misisol.watchStore / dan spring dapat menemukan kacang saya setelahnya.

Mehrdad Sharifi
sumber
0

Menyuntikkan Bean dengan @Qualifier memecahkan masalah saya.

Ponleu
sumber
0

Saya memiliki masalah yang sama. Saya menyelesaikannya dengan menghapus centang opsi "Proses kacang yang dijelaskan secara eksplisit" (lihat gambar di bawah). Opsi ini diaktifkan secara default di linux. Sekarang anotasi @Service dan @Configurations terlihat. tangkapan layar

Aleksander Burzec
sumber
0

sedikit terlambat tetapi saya harap ini membantu orang lain.

Pastikan untuk meletakkan @Service pada kelas implementasi untuk layanan tersebut

@Service
public class ServiceNameImpl implements ServiceName {

    @Override
    public void method(ObjectType paramName) {
        //CODE
    }

}

Begitulah cara saya memperbaiki kesalahan.

Mar Villeneuve
sumber
0

Saya tahu ini adalah pertanyaan lama, tetapi saya belum menemukan jawaban yang memecahkan masalah ini untuk saya, jadi saya akan memberikan solusi saya.

Catatan: Saya pikir masalahnya mungkin begini , tetapi masalah saya tidak terkait dengan penerapan antarmuka yang sama dua kali. Menggunakan @Qualitiermemang membuat masalah saya hilang, tetapi itu adalah perban dan bukan solusi yang tepat jadi saya tidak puas dengan itu.

LATAR BELAKANG

Saya ditugaskan untuk memelihara proyek lama yang telah melalui versi pegas yang berbeda dan hanya diperbarui untuk modul terpisah, jadi hal-hal perlu refactoring, untuk sedikitnya. Saya awalnya mendapatkan masalah kacang duplikat dan mengotak-atik hal-hal mengubah masalah bolak-balik antara masalah OP dan masalah kacang duplikat meskipun hanya ada satu kacang; menavigasi ke kacang duplikat selalu pergi ke kelas yang sama.

MASALAH

Masalah hadir pada @Repositorykelas yang berada @Autowireddi @Servicekelas yang juga memiliki @ComponentScananotasi. Saya perhatikan bahwa saya juga memiliki pegas application-config.xmlyang melakukan context:component-scanpaket dasar, yang menurut saya merupakan pendekatan asli dalam versi Spring yang lebih lama. Saya sedang dalam proses membuat cabang baru dengan mengambil bagian dari cabang lama dan cabang yang lebih baru dalam proyek dukungan yang digunakan dalam proyek berbeda yang dikembangkan selama beberapa tahun dan itulah mengapa ada perpaduan dan kecocokan metodologi.

SOLUSI SEDERHANA

Karena pendekatan penggunaan yang lebih modern @ComponentScansudah diterapkan, saya baru saja menghapusnya application-config.xmldan masalahnya sudah terpecahkan.

Darrel Holt
sumber
0

Yang berikut berhasil untuk saya:

  1. Temukan semua kelas yang menerapkan layanan (antarmuka) yang memberikan kesalahan.
  2. Tandai setiap kelas tersebut dengan anotasi @Service, untuk menunjukkannya sebagai kelas logika bisnis.
  3. Buat ulang proyek.
tonderaimuchada
sumber
0

Saya mungkin sedikit terlambat, tetapi setelah menghabiskan berjam-jam dan meneliti masalah ini.

Saya menemukan bahwa dalam versi terbaru IntelliJ 2020 @AutoWired bersifat opsional dan injeksi ketergantungan berbasis konstruktor lebih disukai.

Saya mengatasi masalah hanya dengan menghapus Anotasi @AutoWired dari kelas Service dan Controller dan menggunakan injeksi ketergantungan berbasis konstruktor.

Tautan ini mungkin membantu.

Selamat Coding!

Syariq Shaikh
sumber
0

Saya mengalami masalah ini dengan hanya satu layanan dengan injeksi ketergantungan berbasis konstruktor dengan versi 2019.2.4 dari IntelliJ. Saya merasa terbantu untuk mengubah nama layanan (shift + f6) dan kemudian membuang perubahan dari level git.

Vodzoo
sumber