intellij dice incorrectamente que no se encontraron beans de tipo para el repositorio con cable automático

138

He creado una prueba unitaria simple pero IntelliJ la resalta incorrectamente en rojo. marcándolo como un error

¿Sin frijoles?

ingrese la descripción de la imagen aquí

Como puede ver a continuación, pasa la prueba? ¿Entonces debe ser Autowired?

ingrese la descripción de la imagen aquí

Robbo_UK
fuente
3
IntelliJ a veces da errores falsos positivos de autowire. Por ejemplo, en las aplicaciones Spring Boot donde gran parte de la configuración está oculta detrás de EnableAutoConfiguration. Hay un problema abierto para eso. Otra causa podría estar configurada incorrectamente Spring facet. Lo que suelo hacer en estas situaciones es reducir la gravedad de la inspección para que sea menos molesta ...
Bohuslav Burghardt

Respuestas:

177

Tuve este mismo problema al crear una aplicación Spring Boot usando su @SpringBootApplicationanotación. Esta anotación representa @Configuration, @EnableAutoConfigurationy de @ComponentScanacuerdo con la referencia de primavera .

Como se esperaba, la nueva anotación funcionó correctamente y mi aplicación se ejecutó sin problemas, pero Intellij siguió quejándose de las @Autowiredependencias incumplidas . Tan pronto como cambié a usar @Configuration, @EnableAutoConfigurationy por @ComponentScanseparado, los errores cesaron. Parece que Intellij 14.0.3 (y muy probablemente, versiones anteriores también) aún no está configurado para reconocer la @SpringBootApplicationanotación.

Por ahora, si los errores te molestan tanto, vuelve a esas tres anotaciones separadas. De lo contrario, ignore Intellij ... su resolución de dependencia está configurada correctamente, ya que su prueba pasa.

Recuerda siempre ...

El hombre siempre es más grande que la máquina.

Abimbola Esuruoso
fuente
1
El problema se solucionó ahora con versiones más recientes de Intellij (revisado en 2017.1)
Sourabh
45
Todavía lo estoy obteniendo con 2017.2, y es la licencia definitiva pagada.
Thomas Carlisle
1
Lo obtengo con 2017.2 y la clase externa SprintBootTest y la clase interna estática SpringBootApplication según el ejemplo de prueba de Spring Cloud Stream: docs.spring.io/spring-cloud-stream/docs/current/reference/html/…
danebez
44
Para versiones más recientes de IntelliJ (p. Ej., 2017), debe habilitar el complemento Spring Data y luego no necesita ninguna de las soluciones anteriores. Hay otra respuesta a continuación que te dice cómo hacerlo.
Norbert
44
Con IntelliJ 2018.2, usando Spring Boot 2.0.5 y @SpringBootApplicationrecibí este error. Seguí el consejo de @ Jaõs Matos usando el scanBasePackagesparámetro @SpringBootApplicationy especifiqué el paquete / espacios de nombres que deberían escanearse.
Dave Goodchild
53

Agregue la anotación Spring @Repositorysobre la clase de repositorio.

Sé que debería funcionar sin esta anotación. Pero si agrega esto, IntelliJ no mostrará error.

@Repository
public interface YourRepository ...
...

Si usa Spring Data con la Repositoryclase extendida , serán paquetes de conflictos. Luego debe indicar paquetes de explicidad.

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

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

Y luego puede conectar automáticamente su repositorio sin errores.

@Autowired
YourRepository yourRepository;

Probablemente no sea una buena solución (supongo que está intentando registrar el repositorio dos veces). Pero trabaja para mí y no muestres errores.

Quizás en la nueva versión de IntelliJ se pueda arreglar: https://youtrack.jetbrains.com/issue/IDEA-137023

mkczyk
fuente
3
De acuerdo con esto youtrack.jetbrains.com/issue/IDEA-148113 está corregido en la versión 16 ... (contiene la respiración)
ismoore999
@Component también parece funcionar. Parece que uno solo necesita forzar el escaneo de la interfaz / clase
Brett
Ya no necesita agregar @Repository. Solo en el complemento Spring Data.
Shin Kim
3
Tres años más tarde y se rompe de nuevo
garyM
Usé / @ Mapper para mi interfaz de mapeador (mybatis). IDEA lanza esta advertencia. Lo cambié a / @ Repository la advertencia desapareció.
bzuo
32

Mi versión de IntelliJ IDEA Ultimate (2016.3.4 Build 163) parece admitir esto. El truco es que debes haber habilitado el complemento Spring Data.

ingrese la descripción de la imagen aquí

Natix
fuente
Esto también solucionó el problema para mí: ¡parece que este puede ser el problema real para cualquiera que de otra manera tenga su código configurado correctamente!
Matsu Q.
55
No funciona en 2017.2.7. El complemento está habilitado, pero la advertencia aún está presente.
congelado el
Trabajó para mí en iJ Ultimate 2018.2.5.
JL_SO
23

En ocasiones, debe indicar dónde @ComponentScan debe buscar componentes. Puede hacerlo pasando los paquetes como parámetro de esta anotación, por ejemplo:

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

Sin embargo, como ya se mencionó, la anotación @SpringBootApplication reemplaza a @ComponentScan, por lo tanto, en tales casos, debe hacer lo mismo:

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

Al menos en mi caso, Intellij dejó de quejarse.

João Matos
fuente
2
Esta es definitivamente la solución mejor y más limpia, y puede confirmar que esto eliminó la advertencia. ¡Gracias!
Dave Goodchild
2
En mi caso, sí, @SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}) y aunque la aplicación funcionó bien, a intellij no le gustó. Cambiando a @SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})arreglado para mí!
GriffoGoes
1
Esta es, con mucho, la mejor solución, ya que es portátil entre IDE y comunica claramente la intención del desarrollador.
MusikPolice
Estoy utilizando ultimate 2019.3.1 spring boot 2.2.1 y java 11.0.4. El problema aún existe en los archivos de prueba unitaria.
garyM
1
lo que @GriffoGoes sugirió solucionó mi problema, ya que estaba usando una estructura de múltiples módulos, esa fue mi mejor solución
Juan Monsalve,
20

Siempre resuelvo este problema haciendo lo siguiente ... Configuración> Inspecciones> Spring Core> Código de lo que cambia de error a advertencia de la opción de gravedad

ingrese la descripción de la imagen aquí

cristianchiess
fuente
2
Fui con esta solución hasta que se solucionó en Spring: youtrack.jetbrains.com/issue/IDEA-182912
Garry Polley el
15

Estoy usando spring-boot 2.0 e intellij 2018.1.1 ultimate edition y me enfrenté al mismo problema.

Resolví colocando @EnableAutoConfiguration en la clase de aplicación principal

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}
Kareem
fuente
13
Esto también "funciona" para mí, pero luego intellij se queja: Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration ¯ \ _ (ツ) _ / ¯
Michael
6

Comprueba si te perdiste la anotación @Service en tu clase de servicio, ese fue el caso para mí.

Yankae
fuente
5

Poner @Componento @configurationen su archivo de configuración de bean parece funcionar, es decir, algo como:

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

Si no desea realizar ningún cambio en su código solo para hacer feliz su IDE. Lo resolví agregando todos los componentes a la faceta Spring.

  1. Cree un grupo con el nombre "Servicio, procesadores y enrutadores" o cualquier nombre que desee;
  2. Elimine y vuelva a crear el "Contexto de aplicación Spring". Use el grupo que creó anteriormente como padre.

ingrese la descripción de la imagen aquí

Xiao Peng - ZenUML.com
fuente
4

Mientras sus pruebas pasen, es bueno, presione alt + entercolocando el cursor sobre el error y dentro del submenú del primer elemento que encontrará, Disable Inspectionseleccione que

imal hasaranga perera
fuente
Gracias. Por cierto, ¿hay alguna manera de ver todos los cambios realizados que no son predeterminados en una vista en la Configuración de IntelliJ (para que sepa lo que ha cambiado)?
powder366
3

Tuve un problema similar en la aplicación Spring Boot. La aplicación utiliza Feign (cliente HTTP que sintetiza solicitudes de interfaces anotadas). Con la interfaz SomeClientanotada @FeignClient, Feign genera una clase de proxy de tiempo de ejecución que implementa esta interfaz. Cuando algún componente Spring intenta conectar automáticamente un bean de tipo SomeClient, Idea se queja de que no se haya SomeClientencontrado ningún bean de tipo ya que en realidad no existe una clase real en el proyecto y a Idea no se le enseña a entender la @FeignClientanotación de ninguna manera.

Solución: anote la interfaz SomeClientcon @Component. (En nuestro caso, no usamos @FeignClientanotación SomeClientdirectamente, sino que usamos metaanotación @OurProjectFeignClientque está anotada @FeignClienty agregar @Componentanotación también funciona).

Tomáš Záluský
fuente
Sí, agregar @Componenta la interfaz resuelve el problema. Pero creo que esta no es la forma correcta ... En mi opinión, esto es un error en IntelliJ IDEA o, por no ser tan difícil, IntelliJ IDEA no está listo para las nuevas versiones de Feign. Funciona sin @Componentversiones anteriores falsas (donde estaba la @FeignClientanotación en org.springframework.cloud.netflix.feignlugar de org.springframework.cloud.openfeign, ¿tal vez esta es la causa del problema?). ¿Ha encontrado más detalles (tal vez un boleto de error) para esto?
Josef Reichardt
No, no lo he hecho, aunque mi caso (que no funcionó sin @Component) es @FeignClientdel org.springframework.cloud.netflix.feignpaquete.
Tomáš Záluský
3
El problema en el rastreador de errores de JetBrains está aquí: youtrack.jetbrains.com/issue/IDEA-168155
Josef Reichardt
3

Configure el contexto de la aplicación y todo estará bien.

ingrese la descripción de la imagen aquí

Arayik Harutyunyan
fuente
2

Y una última información importante: agregue la información ComponentScanpara que la aplicación conozca las cosas que necesita conectar. Esto no es relevante en el caso de esta pregunta. Sin embargo, si no @autowiringse está realizando ninguna, entonces esta es probablemente su solución.

@Configuration
@ComponentScan(basePackages = {
    "some_package",
})
public class someService {
HankCa
fuente
Esto tiene sentido e hizo el truco para mí. ¿Por qué desactivar las advertencias? ¡Las advertencias deberían funcionar como se espera!
WebComer
2

Lo que debes hacer es agregar

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

Como creo que su AppConfiguraion.javapaquete es más profundo que su componente de anotación (paquete @Service, @Component ...),

tales como "package/include/your/annotation/component/deeper/config".

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

Tuve un problema similar en mi aplicación. Cuando agregué anotaciones, el resaltado incorrecto desapareció.

@ContextConfiguration(classes = {...})
K. Gol
fuente
solo para paquetes de prueba!
Iakov Senatov
2

Estoy usando esta anotación para ocultar este error cuando aparece en IntelliJ v.14:

@SuppressWarnings("SpringJavaAutowiringInspection")
Miguel Ángel Medina Aguilar
fuente
Cuando se conecta automáticamente a un constructor, es@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
Loren
2

Para mí, la solución era colocarla @EnableAutoConfigurationen la clase Aplicación debajo de la que @SpringBootApplicationiba a subrayar porque es redundante. ¡Elimínelo y listo, todas sus advertencias sobre los frijoles faltantes desaparecen! Primavera tonta ...

Farkas Archie Bako
fuente
2

en mi caso, el directorio que intentaba @Autowired no estaba al mismo nivel,

después de configurarlo en el mismo nivel de estructura, el error desapareció

Espero que pueda ayudar a alguien!

Davel_AG
fuente
1

¡Mi solución a este problema en mi aplicación de arranque de primavera fue abrir el contexto de la aplicación de primavera y agregar la clase para el bean con cable automático que faltaba manualmente!

(acceso a través del menú Estructura del proyecto o la ventana de herramientas de Spring ... editar "Contexto de aplicación Spring")

Entonces, en lugar de SpringApplicationContext que solo contiene mi configuración de primavera ExampleApplication, también contiene el Bean que falta:

SpringApplicationContext:

  • ExampleApplication.java
  • MissingBeanClass.java

et voilà: ¡El mensaje de error desapareció!

UV
fuente
1

¿Esto todavía parece ser un error en el último IntelliJ y tiene que ver con un posible problema de almacenamiento en caché?

Si agrega la anotación @Repository como mk321 mencionado anteriormente, guarde, luego elimine la anotación y guarde nuevamente, esto soluciona el problema.

Jensen Buck
fuente
1

Todo lo que necesita hacer para que esto funcione es el siguiente código:

@ComponentScan
public class PriceWatchTest{

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...
}
Olammy
fuente
1

Solo tuve que usar @EnableAutoConfiguration para abordarlo, sin embargo, este error no tuvo un impacto funcional.

Codificador inteligente
fuente
1

Se puede resolver colocando @EnableAutoConfiguration en la clase principal de la aplicación de arranque de primavera.

Nirbhay Rana
fuente
0

A veces, en mi caso, la razón es una importación incorrecta. Importé accidentalmente

import org.jvnet.hk2.annotations.Service

en vez de

import org.springframework.stereotype.Service

al aceptar ciegamente la primera opción en las importaciones sugeridas de Idea. Me tomó unos minutos la primera vez que sucedió :-)

Christoph Grimmer-Dietrich
fuente
0

Sorprendentemente, un proyecto orientado a Feign que se ejecutó con éxito con Eclipse no pudo ejecutarse en InteliJ. Cuando inició la aplicación, InteliJ se quejó del cliente Feign que intenté inyectar en la capa serviceImpl diciendo: field personRestClient (mi cliente Feign) en ... requería un bean de tipo ... que no se pudo encontrar. Considere definir un bean de tipo '...' en su configuración.

Perdí mucho tiempo tratando de entender lo que está mal. Encontré una solución (para InteliJ) que no entiendo completamente:

  1. Alt Shift F10 (o ejecutar menú)
  2. Seleccione 'Editar configuración'
  3. En la ventana de configuración, marque la casilla de verificación 'incluir dependencias con alcance "provisto"
  4. Ejecute su aplicación

O elija Eclipse :)

ylev
fuente
0

Comprueba si el paquete de tu bean está escrito correctamente

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


import ...

@Service
class ServiceX {

  ...

}
Jöcker
fuente
0

Use @AutoConfigureMockMvc para la clase de prueba.

Harshad Thombare
fuente
0

Resolví el problema instalando el complemento mybatis en IDEA. Cuando instalé Mybatis Plugin, desapareció.

Snkpty
fuente
0

simple tienes que hacer 2 pasos

  1. agregar hibernate-core depandency
  2. cambie @Autowired a @Resource.
==>> change @Autowired to  @Resource
Er.Rk Yadav
fuente
Explica tu respuesta.
Mentallurg
0

IntelliJ IDEA Ultimate

Agregue su clase principal al contexto de aplicación IntelliJ Spring, por ejemplo Application.java

File -> Project Structure..

lado izquierdo: Configuración del proyecto -> Módulos

lado derecho: busque en la estructura de su paquete Springy agregue+ Application.java

Anton Bondarenko
fuente
Es igual a la respuesta UV
Anton Bondarenko