intellij dicendo erroneamente che non sono stati trovati bean di tipo per il repository autowired


138

Ho creato un semplice test unitario ma IntelliJ lo evidenzia in modo errato in rosso. contrassegnandolo come errore

Niente fagioli?

inserisci qui la descrizione dell'immagine

Come puoi vedere sotto, supera il test? Quindi deve essere Autowired?

inserisci qui la descrizione dell'immagine


3
IntelliJ a volte genera errori di autowire falsi positivi. Ad esempio nelle applicazioni Spring Boot in cui gran parte della configurazione è nascosta dietro EnableAutoConfiguration. C'è un problema aperto per questo. Altre cause potrebbero essere configurate in modo errato Sfaccettatura di primavera. Quello che faccio di solito in queste situazioni è abbassare la gravità dell'ispezione in modo che sia meno invadente ...
Bohuslav Burghardt

Risposte:


177

Ho avuto lo stesso problema durante la creazione di un'applicazione Spring Boot usando la loro @SpringBootApplicationannotazione. Questa annotazione rappresenta @Configuration, @EnableAutoConfiguratione @ComponentScansecondo il riferimento molla .

Come previsto, la nuova annotazione ha funzionato correttamente e la mia applicazione ha funzionato senza intoppi, ma Intellij ha continuato a lamentarsi delle @Autowiredipendenze non soddisfatte . Appena ho cambiato di nuovo ad usare @Configuration, @EnableAutoConfiguratione @ComponentScanseparatamente, gli errori cessarono. Sembra che Intellij 14.0.3 (e molto probabilmente anche le versioni precedenti) non sia ancora configurato per riconoscere l' @SpringBootApplicationannotazione.

Per ora, se gli errori ti disturbano così tanto, torna a quelle tre annotazioni separate. Altrimenti, ignora Intellij ... la risoluzione della tua dipendenza è configurata correttamente, dal momento che il test ha superato.

Ricordate sempre...

L'uomo è sempre più grande della macchina.


1
Il problema è stato risolto ora con le versioni più recenti di Intellij (verificato il 2017.1)
Sourabh

45
Lo sto ancora ottenendo con 2017.2, ed è la licenza definitiva a pagamento.
Thomas Carlisle,

1
Lo sto ottenendo con la classe esterna 2017.2 e SprintBootTest e la classe interna statica SpringBootApplication secondo l'
danebez

4
Per le versioni più recenti di IntelliJ (ad es. 2017) è necessario abilitare il plug-in Spring Data e quindi non è necessaria alcuna delle soluzioni alternative sopra. C'è un'altra risposta qui sotto che ti dice come farlo.
Norbert,

4
Con IntelliJ 2018.2, usando Spring Boot 2.0.5 e @SpringBootApplicationstavo ricevendo questo errore. Ho seguito il consiglio di @ Jaõs Matos usando il scanBasePackagesparametro @SpringBootApplicatione ho specificato il pacchetto / spazi dei nomi che dovrebbero essere scansionati.
Dave Goodchild,

53

Aggiungi l'annotazione Spring @Repositorysulla classe del repository.

So che dovrebbe funzionare senza questa annotazione. Ma se aggiungi questo, IntelliJ non mostrerà errori.

@Repository
public interface YourRepository ...
...

Se si utilizzano i dati di primavera con Repositoryclasse di estensione , saranno pagkages di conflitto. Quindi è necessario indicare pagkages espliciti.

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

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

E poi puoi autorizzare il tuo repository senza errori.

@Autowired
YourRepository yourRepository;

Probabilmente non è una buona soluzione (immagino che tu stia provando a registrare due volte il repositorio). Ma lavora per me e non mostrare errori.

Forse nella nuova versione di IntelliJ può essere risolto: https://youtrack.jetbrains.com/issue/IDEA-137023


3
Secondo questo youtrack.jetbrains.com/issue/IDEA-148113 è stato risolto nella versione 16 ... (trattiene il respiro)
ismoore999,

Anche @Component sembra funzionare. Sembra che uno debba solo forzare la scansione dell'interfaccia / classe
Brett,

Non è più necessario aggiungere @Repository. Solo sul plugin Spring Data.
Shin Kim,

3
Tre anni dopo è di nuovo rotto
garyM

Ho usato / @ Mapper per la mia interfaccia mapper (mybatis). IDEA lancia questo avviso. L'ho cambiato in / @ Repository l'avviso è andato.
bzuo

32

La mia versione di IntelliJ IDEA Ultimate (2016.3.4 Build 163) sembra supportare questo. Il trucco è che devi aver abilitato il plug-in Spring Data.

inserisci qui la descrizione dell'immagine


Ciò ha risolto il problema anche per me - Sembra che questo potrebbe essere il vero problema per chiunque altrimenti abbia impostato correttamente il proprio codice!
Matsu Q.

5
Non funziona nel 2017.2.7. Il plugin è abilitato, ma l'avviso è ancora presente.
brainfrozen

Ha funzionato per me in iJ Ultimate 2018.2.5.
JL_SO,

23

A volte viene richiesto di indicare dove @ComponentScan deve cercare i componenti. Puoi farlo passando i pacchetti come parametro di questa annotazione, ad esempio:

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

Tuttavia, come già accennato, l'annotazione @SpringBootApplication sostituisce @ComponentScan, quindi in questi casi è necessario fare lo stesso:

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

Almeno nel mio caso, Intellij ha smesso di lamentarsi.


2
Questa è sicuramente la soluzione migliore e più pulita e può confermare che questo ha rimosso l'avvertimento. Grazie!
Dave Goodchild,

2
Nel mio caso avevo @SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) e sebbene l'app funzionasse bene, a Intellij non piaceva. Passando a @SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})riparato per me!
GriffoGoes

1
Questa è di gran lunga la soluzione migliore, poiché è portabile tra IDE e comunica chiaramente l'intenzione degli sviluppatori.
MusikPolice,

Sto usando lo stivale a molla 2.2.3 2019.3.1 e java 11.0.4 definitivi. Il problema persiste nei file di unit test.
garyM,

1
quello che @GriffoGoes ha suggerito risolto il mio problema, dato che stavo usando una struttura multi modulo, quella era la mia migliore soluzione
Juan Monsalve


15

Sto usando spring-boot 2.0 e intellij 2018.1.1 ultimate edition e ho riscontrato lo stesso problema.

Ho risolto inserendo @EnableAutoConfiguration nella classe principale dell'applicazione

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

13
Anche questo "funziona" per me, ma poi Intellij si lamenta: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Michael,

6

Controlla se hai perso l'annotazione @Service nella tua classe di servizio, è stato il caso per me.


5

Mettere @Componento @configurationnel file di configurazione del bean sembra funzionare, cioè qualcosa di simile a:

@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

Se non vuoi apportare modifiche al tuo codice solo per rendere felice il tuo IDE. L'ho risolto aggiungendo tutti i componenti alla faccetta Spring.

  1. Crea un gruppo con il nome "Servizio, Processori e Router" o qualsiasi nome ti piaccia;
  2. Rimuovere e ricreare "Spring Application Context" utilizzare il gruppo creato in precedenza come genitore.

inserisci qui la descrizione dell'immagine


4

Fintanto che i test passano, sei a posto, colpisci alt + enterportando il cursore sopra l'errore e all'interno del sottomenu del primo oggetto troverai Disable Inspectionche seleziona


Grazie. A proposito c'è un modo per vedere tutte le modifiche apportate che non sono predefinite in una vista in Impostazioni IntelliJ (quindi sai cosa hai cambiato)?
powder366,

3

Ho avuto un problema simile nell'applicazione Spring Boot. L'applicazione utilizza Feign (client HTTP che sintetizza richieste da interfacce annotate). Dopo aver SomeClientannotato l' interfaccia con @FeignClient, Feign genera una classe proxy di runtime implementando questa interfaccia. Quando un componente Spring tenta di autowire il bean di tipo SomeClient, Idea si lamenta di non aver SomeClienttrovato un bean di tipo poiché non esiste alcuna classe reale nel progetto e a Idea non viene insegnato a capire@FeignClient annotazione in alcun modo.

Soluzione: annotare l'interfaccia SomeClientcon @Component. (Nel nostro caso, non usiamo l' @FeignClientannotazione suSomeClient direttamente , piuttosto usiamo la metaannotazione @OurProjectFeignClientche è annotata @FeignCliente anche l'aggiunta di @Componentannotazioni funziona).


Sì, l'aggiunta @Componentall'interfaccia risolve il problema. Ma penso che questo non sia il modo corretto ... Secondo me questo è un bug in IntelliJ IDEA o, per essere non così difficile, IntelliJ IDEA non è pronto per le nuove versioni di Feign. Funziona senza @Componentversioni più false (dove si trovava l' @FeignClientannotazione org.springframework.cloud.netflix.feignanziché org.springframework.cloud.openfeign- forse questa è la causa del problema?). Hai trovato ulteriori dettagli (forse un bug ticket) per questo?
Josef Reichardt,

No, non ho, anche se il mio caso (che non ha funzionato senza @Component) @FeignClientproviene da org.springframework.cloud.netflix.feign) pacchetto.
Tomáš Záluský,

3
Il problema con il bug tracker JetBrains è qui: youtrack.jetbrains.com/issue/IDEA-168155
Josef Reichardt,


2

E un'ultima informazione importante: aggiungi ComponentScanl'app in modo che l'app sia a conoscenza delle cose che deve collegare. Questo non è rilevante nel caso di questa domanda. Tuttavia, se non @autowiringviene eseguito affatto, questa è probabilmente la soluzione.

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

Questo ha senso e ha fatto il trucco per me. Perché disattivare gli avvisi? Gli avvisi dovrebbero funzionare come previsto!
WebComer

2

Quello che devi fare è aggiungere

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

Dal momento che penso che il tuo AppConfiguraion.javapacchetto sia più profondo del tuo componente di annotazione (@Service, @Component ...),

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


@ComponentScan ("package.include.your.annotation.component")!
Iakov Senatov,

2

Ho avuto un problema simile nella mia domanda. Quando ho aggiunto le annotazioni, l'highlight non corretto è scomparso.

@ContextConfiguration(classes = {...})

solo per pacchetti di test!
Iakov Senatov,

2

Sto usando questa annotazione per nascondere questo errore quando appare in IntelliJ v.14:

@SuppressWarnings("SpringJavaAutowiringInspection")

Quando è autofirmato in un costruttore, è@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Loren,

2

Per me la soluzione era quella di collocare @EnableAutoConfigurationnella classe Application sotto la @SpringBootApplicationsua intenzione di sottolinearla perché ridondante. Eliminalo e voilà tutti i tuoi avvertimenti sui fagioli mancanti sono scomparsi! Silly Spring ...


2

nel mio caso, la directory che stavo cercando di @Autowired non era allo stesso livello,

dopo averlo impostato allo stesso livello di struttura, l'errore è scomparso

spero che possa aiutare qualcuno!


1

La mia soluzione a questo problema nella mia applicazione di avvio di primavera era aprire il contesto dell'applicazione di primavera e aggiungere manualmente la classe per il bean autowired mancante!

(accesso tramite il menu Struttura del progetto o la finestra degli strumenti a molla ... modifica "Contesto dell'applicazione primavera")

Quindi, invece di SpringApplicationContext, contenente solo la mia configurazione di primavera di ExampleApplication, contiene anche il bean mancante:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: il messaggio di errore è scomparso!


1

Questo sembra essere ancora un bug nell'ultimo IntelliJ e ha a che fare con un possibile problema di memorizzazione nella cache?

Se aggiungi l'annotazione @Repository come mk321 menzionata sopra, salva, quindi rimuovi l'annotazione e salva di nuovo, questo risolve il problema.


1

Tutto ciò che devi fare per far funzionare questo è il seguente codice:

@ComponentScan
public class PriceWatchTest{

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

1

Ho dovuto usare @EnableAutoConfiguration per risolverlo, tuttavia questo errore non ha avuto alcun impatto funzionale.


1

Può essere risolto posizionando @EnableAutoConfiguration sulla classe principale dell'applicazione Spring Boot.


0

A volte, nel mio caso, il motivo è un'importazione sbagliata. Ho importato per errore

import org.jvnet.hk2.annotations.Service

invece di

import org.springframework.stereotype.Service

accettando ciecamente la prima scelta nelle importazioni suggerite da Idea. Mi ci sono voluti alcuni minuti la prima volta che è successo :-)


0

Sorprendentemente, un progetto orientato a Feign che ha funzionato con successo con Eclipse non ha potuto essere eseguito in InteliJ. All'avvio dell'applicazione, InteliJ si è lamentato del client Feign che ho cercato di iniettare nel livello serviceImpl dicendo: field personRestClient (il mio client Feign) in ... richiedeva un bean di tipo ... che non è stato possibile trovare. Prendi in considerazione la definizione di un bean di tipo "...." nella tua configurazione.

Ho perso molto tempo cercando di capire cosa c'è che non va. Ho trovato una soluzione (per InteliJ) che non capisco completamente:

  1. Alt Shift F10 (o menu Esegui)
  2. Seleziona "Modifica configurazione"
  3. Nella finestra di configurazione, seleziona la casella di controllo "Includi dipendenze con ambito" Fornito "
  4. Esegui la tua applicazione

O scegli Eclipse :)


0

Controlla se il pacchetto del tuo bean è scritto correttamente

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


import ...

@Service
class ServiceX {

  ...

}


0

Ho risolto il problema installando il plug-in mybatis in IDEA. Quando ho installato Mybatis Plugin, è scomparso.


0

semplice devi fare 2 passaggi

  1. aggiungere la depandenza del core di ibernazione
  2. cambia @Autowired in @Resource.
==>> change @Autowired to  @Resource

Spiega la tua risposta.
Mentallurg,

0

IntelliJ IDEA Ultimate

Aggiungi la tua classe principale al contesto dell'applicazione IntelliJ Spring, ad esempio Application.java

File -> Project Structure..

lato sinistro: Impostazioni progetto -> Moduli

lato destro: trova nella struttura del pacchetto Springe aggiungi+ Application.java


È uguale alla risposta UV
Anton Bondarenko
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.