IntelliJ IDEA mostra gli errori quando si utilizza l'annotazione @Autowired di Spring


102

IntelliJ IDEA mostra errori quando utilizzo l' @Autowiredannotazione di Spring nella classe, ma la classe funziona senza problemi.

Ecco questo messaggio di errore:

I membri autowired devono essere definiti nello spring bean valido (@ Component / @ Service, ecc.) Less ... (Ctrl + F1) Controlla i problemi di autowiring in una classe bean.


5
prova a usare questo: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob

Ho lo stesso errore per le mie classi di test di integrazione. Penso che usare l'annotazione @SupressWarnings sia una buona soluzione.
Kevin Wittek

Intellij 2016.2 lo sta facendo con il mio progetto Spring Boot / Spring Data. Quale file sta esaminando Intellij per accertare quali bean esistono?
Adam

2
Ho dovuto usare @SuppressWarnings ("SpringJavaAutowiredMembersInspection")
user672009

3
Per l'utilizzo di IntelliJ IDEA 2017.3.1 (Ultimate Edition)@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Risposte:


31

Ho avuto lo stesso problema con IntelliJ IDEA 13.1.4 L'ho risolto rimuovendo il facet Spring (File-> Project Structure) e lasciandolo mostrare solo "Detection".


36
Ma cosa succede se ti dimentichi di annotare un fagiolo. Non riceverai alcun avviso?
Cleankod

22

Se sai che il bean esiste ed è solo un problema di ispezioni, aggiungi semplicemente quanto segue prima della dichiarazione della variabile:

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

A volte IntelliJ non può risolvere se un bean è stato dichiarato, ad esempio quando il bean è incluso in modo condizionale e la risoluzione della condizione avviene in fase di esecuzione.


21

L'ho risolto aggiungendo l'avviso supress:

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....

19

Ho lo stesso errore qui!

Sembra che Intellij non possa verificare se l'implementazione della classe è un @Service o @Component.

Risolvilo semplicemente cambiando da Errore ad Avviso (premendo Alt + Invio).


18

Rimuovi il file .iml da tutto il modulo del tuo progetto e poi vai su File -> Invalidate Caches / Restart


9
Rimuovere le sfaccettature e sopprimere gli avvisi o simili "correzioni" non sembrava logico o intelligente, quindi ho provato a farlo. Ma non ho fatto l'ultimo passaggio lo stesso. Invece ho cancellato il mio .imlfile, ho scelto di reimportare nelle opzioni di Maven sul pom.xmlfile e ho fatto un ctrl + sper rigenerare il file .iml. Errori spariti.
ChiefTwoPencils


5

Ho avuto lo stesso problema. L'ho risolto aggiungendo il facet Spring (File-> Struttura del progetto) per ogni modulo pertinente, quindi aggiungendo i file di configurazione. Per alcuni progetti (spring mvc), i file di configurazione sono stati rilevati automaticamente. Tuttavia, per un progetto jar, ho dovuto aggiungere manualmente i file di configurazione.


4

Assicurati di avere le definizioni dei bean Spring corrette. A volte, l'applicazione funziona bene, mostra solo un errore nell'IDE, controlla il file 'iml' del tuo progetto se hai definito un aspetto Spring.


Controlla anche il tuo application-properties.xml. Verificare se il contesto di riga: component-scan base-package = "com.my.project" non esclude il pacchetto del servizio a cui si fa riferimento.
i-bob

Ho inserito il tuo codice in "bec-job.iml" del mio progetto, ma il problema esiste ancora. E non riesco a trovare il nome del file "applicationContext-interface.xml" nel mio progetto, puoi parlarne in dettaglio ?
Vainlyh

devi mettere @SuppressWarnings ("SpringJavaAutowiringInspection") proprio sopra la parte @Autowired del tuo codice che è evidenziata in rosso. In questo modo IntelliJIdea riconosce quale avvertimento sopprimere.
i-bob

devi trovare il file "application-properties.xml", non "applicationContext-interface.xml"
i-bob

1
Quel @SuppressWarnings ("SpringJavaAutowiringInspection") mi sembra hacky, ma funziona. Grazie ragazzi.
Minras

3

Risolto il problema andando su File >> Struttura del progetto >> Sfaccettature e quindi aggiungendo tutti i file di configurazione a Spring Facet. Successivamente ha iniziato a rilevare i file in cui risiedono i bean ed è stato in grado di risolvere il problema. IntelliJ che dà questo controllo è piuttosto prezioso e IMHO non dovrebbe essere disabilitato.


Non vedo la primavera come un possibile aspetto. Quale versione di Intellij hai?
jDub9

2

Sembra un problema di visibilità: il controller principale non vede il componente che stai tentando di collegare.

Prova ad aggiungere

@ComponentScan("path to respective Component") 

al controllore genitore.


2

Assicurati che il tuo IntelliJ Idea (IDE) sia a conoscenza di tutte le configurazioni di molle necessarie contro cui il tuo modulo viene ispezionato.

Puoi verificarlo sotto

File> Struttura del progetto> Moduli> [il nome del progetto nel pannello di destra]> Primavera

A volte, dobbiamo dire esplicitamente all'IDE che la configurazione della molla proviene da una dipendenza (un jar presente nel classpath del progetto)


1
è disponibile nella community edition o solo nella versione definitiva?
Archimedes Trajano

1

Ho lo stesso problema. Il mio era perché il bean contenente il riferimento autowired non era un componente Spring (era un EJB), ma aveva un SpringBeanAutowiringInterceptor Interceptor che permetteva l'uso dell'autowiring. Penso che Intellij non prenda questa possibilità nella sua ispezione Autowiring.


1

Anch'io ho avuto questo problema. Facendo alt+ entere poi chiedendo di rieseguire o disabilitare l'ispezione della molla sulla linea effettuata, il problema è stato risolto. Questo sembra essere diventato un problema solo dopo l'aggiornamento 13.4.


1

nel mio caso mi mancava scrivere in 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>

e nel file di contesto dell'applicazione:

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

dopo aver aggiunto questo tag ed eseguito Maven per ricostruire il progetto, l'errore autowired in intellj scompare e l'icona del fagiolo appare nel margine sinistro: inserisci qui la descrizione dell'immagine


1

Il mio è per non aver aggiunto @Repository sulla mia interfaccia CrudRepository, il tutorial che stavo guardando non lo ha aggiunto su STS e non si è lamentato.


1

Dovresti controllare se hai @Component, @Repository o simili aggiunti alla classe



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 {

0

Ho risolto questo problema in questo modo. In IntelliJ tutti i tuoi pacchetti dovrebbero essere in un sottopacchetto che è il sottopacchetto di main / java. Ad esempio, ho inserito tutti i miei pacchetti in src / main / java / com.misisol.watchStore / e la primavera potrebbe trovare i miei bean in seguito.


0

Inject Bean with @Qualifier ha risolto il problema per me.


0

Ho avuto un problema simile. L'ho risolto deselezionando l'opzione "Elabora i bean annotati in modo esplicito" (vedi screenshot sotto). Questa opzione è abilitata per impostazione predefinita su Linux. Ora sono visibili le annotazioni @Service e @Configurations. immagine dello schermo


0

un po 'tardi ma spero che aiuti qualcun altro.

Assicurati di mettere @Service nella classe di implementazione per il servizio

@Service
public class ServiceNameImpl implements ServiceName {

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

}

È così che ho risolto l'errore.


0

So che questa è una vecchia domanda, ma non ho trovato alcuna risposta che mi abbia risolto questo problema, quindi fornirò la mia soluzione.

Nota: pensavo che il problema potesse essere questo , ma il mio problema non era correlato all'implementazione della stessa interfaccia due volte. L'uso @Qualitierha risolto il mio problema, ma era una benda e non una soluzione adeguata, quindi non mi sono accontentato.

SFONDO

Ho il compito di mantenere un vecchio progetto che ha attraversato diverse versioni di Spring e aggiornato solo per moduli separati, quindi le cose avevano bisogno di un refactoring, per non dire altro. Inizialmente avevo ottenuto il problema del bean duplicato e armeggiare con le cose ha cambiato il problema avanti e indietro tra il problema dell'OP e il problema del bean duplicato anche se c'era un solo bean; la navigazione verso i bean duplicati è sempre andata alla stessa classe.

IL PROBLEMA

Il problema era presente in una @Repositoryclasse che era @Autowiredin una @Serviceclasse che aveva anche l' @ComponentScanannotazione. Ho notato che avevo anche una molla application-config.xmlche stava facendo acontext:component-scan sul pacchetto base, che credo fosse l'approccio originale nelle versioni precedenti di Spring. Stavo creando una nuova filiale prendendo parti di una vecchia filiale e una nuova filiale in un progetto di supporto che è stato utilizzato in diversi progetti che sono stati sviluppati nel corso di diversi anni ed è per questo che c'era un tale mix-and-match delle metodologie.

SOLUZIONE SEMPLICE

Poiché l'approccio più moderno di utilizzo @ComponentScanera già stato implementato, ho semplicemente rimosso il application-config.xmle il problema è stato risolto.


0

Quanto segue ha funzionato per me:

  1. Trova tutte le classi che implementano il servizio (interfaccia) che sta dando l'errore.
  2. Contrassegnare ciascuna di queste classi con l'annotazione @Service, per indicarle come classi di logica aziendale.
  3. Ricostruisci il progetto.

0

Potrei essere un po 'in ritardo, ma dopo aver trascorso ore e ricerche su questo problema.

L'ho scoperto nell'ultima versione IntelliJ 2020 @AutoWired è opzionale e l'iniezione di dipendenza basata sul costruttore è preferibile.

Ho risolto il problema semplicemente rimuovendo @AutoWired annotazione dalla classe Service and Controller e utilizzando dipendenze basato sul costruttore.

Questo collegamento potrebbe aiutare.

Buona programmazione!


0

Ho avuto questo problema con un solo servizio con l'inserimento delle dipendenze basato sul costruttore con la versione 2019.2.4 di IntelliJ. Ho trovato utile cambiare il nome del servizio (MAIUSC + F6) e quindi scartare le modifiche dal livello git.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.