IntelliJ IDEA muestra errores al usar la anotación @Autowired de Spring

102

IntelliJ IDEA muestra errores cuando uso la @Autowiredanotación de Spring en la clase, pero la clase funciona sin ningún problema.

Aquí está este mensaje de error:

Los miembros con cableado automático deben definirse en el bean de primavera válido (@ Componente / @ Servicio, etc.) menos ... (Ctrl + F1) Comprueba los problemas de cableado automático en una clase de bean.

Vainlyh
fuente
5
intente usar esto: @SuppressWarnings ("SpringJavaAutowiringInspection")
i-bob
Tengo el mismo error para mis clases de prueba de integración. Creo que usar la anotación @SupressWarnings es una buena solución.
Kevin Wittek
Intellij 2016.2 está haciendo esto con mi proyecto de datos de primavera / arranque de primavera. ¿Qué archivo está mirando Intellij para determinar qué frijoles existen?
Adam
2
Tuve que usar @SuppressWarnings ("SpringJavaAutowiredMembersInspection")
user672009
3
Para IntelliJ IDEA 2017.3.1 (Ultimate Edition) uso@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Respuestas:

31

Tuve el mismo problema con IntelliJ IDEA 13.1.4. Lo resolví eliminando la faceta Spring (Archivo-> Estructura del proyecto) y dejé que solo mostrara "Detección".

Jose leon
fuente
36
Pero, ¿qué pasa si realmente te olvidas de anotar un bean? ¿No recibirás ninguna advertencia?
Cleankod
22

Si sabe que el bean existe y es solo un problema de las inspecciones, simplemente agregue lo siguiente antes de la declaración de la variable:

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

A veces, IntelliJ no puede resolver si se ha declarado un bean, por ejemplo, cuando el bean se incluye condicionalmente y la resolución de la condición ocurre en tiempo de ejecución.

lanoxx
fuente
21

Lo arreglé agregando la advertencia de supresión:

 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
 @Autowired
 private ....
user3580264
fuente
19

¡Tengo el mismo error aquí!

Parece que Intellij no puede verificar si la implementación de la clase es @Service o @Component.

Resuélvalo simplemente cambiando de Error a Advertencia (presionando Alt + Enter).

Thiago Pereira
fuente
18

Elimine el archivo .iml de todo el módulo de su proyecto y luego vaya a Archivo -> Invalidar cachés / Reiniciar

Maciej
fuente
9
Eliminar facetas y suprimir advertencias o "arreglos" similares no parecía lógico o inteligente, así que le di una oportunidad. Pero no hice el último paso igual. En su lugar, eliminé mi .imlarchivo, elegí volver a importar en las opciones de maven en el pom.xmlarchivo e hice una ctrl + sregeneración del archivo .iml. Los errores desaparecieron.
ChiefTwoPencils
13

Archivo -> Estructura del proyecto -> Módulos -> + (en la columna central) -> Primavera -> Aceptar

Aleksey Samoylov
fuente
que columna central?
Kuldeep Yadav
5

Yo tuve el mismo problema. Lo resolví agregando la faceta Spring (Archivo-> Estructura del proyecto) para cada módulo relevante, y luego agregué los archivos de configuración. Para algunos proyectos (spring mvc), los archivos de configuración se detectaron automáticamente. Sin embargo, para un proyecto jar, tuve que agregar los archivos de configuración manualmente.

jbarrameda
fuente
4

Asegúrese de que sus definiciones de frijoles Spring sean correctas. A veces, la aplicación funciona bien, solo muestra un error en el IDE, verifique el archivo 'iml' de su proyecto si tiene definida una faceta de Spring.

yo-bob
fuente
También verifique su application-properties.xml. Compruebe si la línea context: component-scan base-package = ”com.my.project” no excluye el paquete del servicio al que hace referencia.
i-bob
Puse su código en el "bec-job.iml" de mi proyecto, pero el problema aún existe. Y no puedo encontrar el nombre del archivo es "applicationContext-interface.xml" en mi proyecto, ¿puede contarlo en detalle? ?
Vainlyh
debe poner @SuppressWarnings ("SpringJavaAutowiringInspection") justo encima de la parte @Autowired de su código que está resaltada en rojo. De esta forma, IntelliJIdea reconocerá qué advertencia suprimir.
i-bob
debe encontrar el archivo "application-properties.xml", no "applicationContext-interface.xml"
i-bob
1
Ese @SuppressWarnings ("SpringJavaAutowiringInspection") me parece un truco, pero funciona. Gracias chicos.
Minras
3

Resolvió el problema yendo a Archivo >> Estructura del proyecto >> Facetas y luego agregando todos los archivos de configuración a Spring Facet. Después de eso, comenzó a detectar archivos en los que residen los beans y pudo solucionar el problema. IntelliJ dando este cheque es bastante valioso y en mi humilde opinión no debería deshabilitarse.

tomcyjohn
fuente
No veo a Spring como una posible faceta. ¿Qué versión de Intellij tienes?
jDub9
2

Parece que el problema de la visibilidad es que el controlador principal no ve el componente que está intentando conectar.

Intenta agregar

@ComponentScan("path to respective Component") 

al controlador principal.

Eugene Karasev
fuente
2

Asegúrese de que su IntelliJ Idea (IDE) conozca todas las configuraciones de resorte necesarias contra las que se está inspeccionando su módulo.

Puedes comprobar esto en

Archivo> Estructura del proyecto> Módulos> [nombre de su proyecto en el panel derecho]> Spring

A veces, necesitamos decirle explícitamente al IDE que la configuración de primavera proviene de una dependencia (un jar presente en la ruta de clase de su proyecto)

vivekmore
fuente
1
¿Está disponible en la edición comunitaria o solo en la versión definitiva?
Archimedes Trajano
1

Tengo el mismo problema. El mío fue porque el bean que contenía la referencia autowired no era un componente Spring (era un EJB), pero obtuvo un SpringBeanAutowiringInterceptor Interceptor que permitía el uso de autowiring. Creo que Intellij no toma esta posibilidad en su inspección de Autowiring.

Teocali
fuente
1

Yo tuve este problema también. Haciendo alt+ entery luego pidiendo volver a ejecutar o deshabilitar la inspección de Spring en la línea afectada lo solucionó. Esto solo parece haberse convertido en un problema después de la actualización 13.4.

Jason D
fuente
1

en mi caso me faltaba escribir en 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>

y en el archivo de contexto de la aplicación:

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

después de agregar estas etiquetas y ejecutar maven para reconstruir el proyecto, el error autowired en intellj desaparece y el icono de frijol aparece en el margen izquierdo: ingrese la descripción de la imagen aquí

demian
fuente
1

El mío es por no agregar @Repository en mi interfaz CrudRepository, el tutorial que estaba viendo no lo agregó en STS y no se quejó.

Rejinderi
fuente
1

Debe verificar si tiene @Component, @Repository o similar agregado en la clase

Milos Nikolik
fuente
0

Resolví eso agregando una faceta Web.

Pavel Vlasov
fuente
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 {
sotavento
fuente
0

He resuelto este problema de esta manera. En IntelliJ, todos sus paquetes deben estar en un subpaquete que es el subpaquete de main / java. Por ejemplo, puse todos mis paquetes en src / main / java / com.misisol.watchStore / y Spring pudo encontrar mis beans luego.

Mehrdad Sharifi
fuente
0

Inject Bean with @Qualifier resolvió el problema por mí.

Ponleu
fuente
0

Tuve un problema similar. Lo resolví desmarcando la opción "Procesar frijoles anotados explícitamente" (ver captura de pantalla a continuación). Esta opción está habilitada de forma predeterminada en Linux. Ahora las anotaciones @Service y @Configurations son visibles. captura de pantalla

Aleksander Burzec
fuente
0

un poco tarde pero espero que ayude a alguien más.

Asegúrese de poner @Service en la clase de implementación para el servicio

@Service
public class ServiceNameImpl implements ServiceName {

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

}

Así es como solucioné el error.

Mar Villeneuve
fuente
0

Sé que esta es una pregunta antigua, pero no he encontrado ninguna respuesta que me haya resuelto este problema, así que daré mi solución.

Nota: pensé que el problema podría haber sido este , pero mi problema no estaba relacionado con la implementación de la misma interfaz dos veces. El uso @Qualitierhizo que mi problema desapareciera, pero era un vendaje y no una solución adecuada, así que no me conformé con eso.

ANTECEDENTES

Tengo la tarea de mantener un proyecto antiguo que ha pasado por diferentes versiones de Spring y solo se actualizó para módulos separados, por lo que las cosas necesitaban refactorización, por decir lo menos. Inicialmente obtuve el problema de los frijoles duplicados y jugar con las cosas cambiaba el problema de un lado a otro entre el problema de OP y el problema del frijol duplicado a pesar de que solo había un frijol; la navegación a los beans duplicados siempre fue a la misma clase.

LA CUESTIÓN

El problema estaba presente en una @Repositoryclase que estaba @Autowireden una @Serviceclase que también tenía la @ComponentScananotación. Noté que también tenía un resorte application-config.xmlque estaba haciendo un context:component-scanen el paquete base, que creo que era el enfoque original en versiones anteriores de Spring. Estaba en el proceso de hacer una nueva sucursal al tomar partes de una sucursal vieja y una sucursal más nueva en un proyecto de apoyo que se usó en diferentes proyectos que se desarrollaron durante varios años y es por eso que hubo tal combinación de metodologías.

SOLUCIÓN SIMPLE

Como @ComponentScanya se implementó el enfoque más moderno de uso , simplemente eliminé el application-config.xmly el problema se resolvió.

Darrel Holt
fuente
0

Lo siguiente funcionó para mí:

  1. Busque todas las clases que implementan el servicio (interfaz) que está dando el error.
  2. Marque cada una de esas clases con la anotación @Service, para indicarlas como clases de lógica empresarial.
  3. Reconstruye el proyecto.
tonderaimuchada
fuente
0

Puede que llegue un poco tarde, pero después de pasar horas investigando sobre este tema.

Descubrí que en la última versión IntelliJ 2020 @AutoWired es opcional y es preferible la inyección de dependencia basada en el constructor.

Resolví el problema simplemente eliminando la anotación @AutoWired de la clase de servicio y controlador y usando la inyección de dependencia basada en constructor.

Este enlace puede ayudar.

¡Feliz codificación!

Shariq Shaikh
fuente
0

Tuve este problema con solo un servicio con inyección de dependencia basada en constructor con la versión 2019.2.4 de IntelliJ. Encontré útil cambiar el nombre del servicio (shift + f6) y luego descartar los cambios del nivel de git.

Vodzoo
fuente