IntelliJ IDEA在使用Spring的@Autowired注释时显示错误


102

当我@Autowired在类中使用Spring的注释时,IntelliJ IDEA会显示错误,但是该类可以正常运行。

这是此错误消息:

必须在有效的Spring bean(@ Component / @ Service等)中定义自动装配的成员,然后...(Ctrl + F1)检查bean类中的自动装配问题。


5
尝试使用此方法:@SuppressWarnings(“ SpringJavaAutowiringInspection”)
i-bob

我的集成测试类存在相同的错误。我认为使用@SupressWarnings注释是一个不错的解决方案。
凯文·威特克

Intellij 2016.2正在使用我的spring boot / spring数据项目执行此操作。Intellij正在查看哪个文件以确定存在哪些bean?
亚当

2
我不得不使用@SuppressWarnings(“ SpringJavaAutowiredMembersInspection”)
user672009 2016年

3
对于IntelliJ IDEA 2017.3.1(Ultimate Edition),请使用@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
lealceldeiro

Answers:


31

我在IntelliJ IDEA 13.1.4中遇到了相同的问题,我通过删除Spring构面(“文件”->“项目结构”)并将其保留为仅显示“检测”来解决该问题。


36
但是,如果您实际上忘记为豆加注怎么办?您不会收到任何警告吗?
Cleankod 2015年

22

如果您知道该bean存在并且只是检查的问题,那么只需在变量声明之前添加以下内容:

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

有时IntelliJ无法解析是否已声明bean,例如,有条件地包含bean且条件解析在运行时发生。


21

我通过添加禁止警告来解决此问题:

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


18

从所有项目模块中删除.iml文件,然后转到File-> Invalidate Caches / Restart


9
删除构面并禁止警告或类似的“修复”似乎并不合逻辑或不明智,因此我给了一个机会。但是我没有做最后一步。相反,我删除了.iml文件,选择在pom.xml文件的maven选项中重新导入,并进行了ctrl + s重新生成.iml。错误消失了。
ChiefTwoPencils 2015年


5

我有同样的问题。我通过为每个相关模块添加Spring facet(文件->项目结构)来解决它,然后添加配置文件。对于某些项目(spring mvc),将自动检测配置文件。但是,对于jar项目,我必须手动添加配置文件。


4

确保您的Spring bean定义正确。有时,该应用程序运行良好,仅在IDE中显示错误,如果定义了Spring facet,请检查项目的“ iml”文件。


还要检查您的application-properties.xml。检查line context:component-scan base-package =“ com.my.project”是否不排除您所引用的服务的软件包。
i-bob 2014年

我将您的代码放入项目的“ bec-job.iml”中,但问题仍然存在。在我的项目中找不到文件名为“ applicationContext-interface.xml”,能否详细介绍一下?
Vainlyh 2014年

您必须将@SuppressWarnings(“ SpringJavaAutowiringInspection”)放在代码的@Autowired部分上方,该部分为红色高亮。这样IntelliJIdea可以识别要抑制的警告。
i-bob 2014年

您必须找到文件“ application-properties.xml”,而不是“ applicationContext-interface.xml”
i-bob 2014年

1
在我看来,@ SuppressWarnings(“ SpringJavaAutowiringInspection”)似乎很客气,但是可以。多谢你们。
Minras 2014年

3

通过转到文件>>项目结构>>构面,然后将所有配置文件添加到Spring Facet,解决了该问题。之后,它开始检测Bean所在的文件,并能够对问题进行排序。IntelliJ提供此检查非常有价值,不应禁用IMHO。


我不认为Spring是可能的方面。您有什么版本的Intellij?
jDub9


2

确保您的IntelliJ Idea(IDE)知道要检查其模块的所有必需的弹簧配置。

您可以在下面检查

文件>项目结构>模块> [右侧面板中的项目名称]> Spring

有时,我们需要明确地告诉IDE,spring配置来自于依赖项(项目类路径中存在一个jar)


1
这在社区版中可用还是仅在最终版中可用?
Archimedes Trajano

1

我遇到了同样的问题。我的想法是因为包含自动连接的引用的bean不是Spring组件(它是EJB),而是获得了一个SpringBeanAutowiringInterceptor Interceptor,可以使用自动装配。我认为Intellij在其自动装配检查中不会采取这种可能性。


1

我也有这个问题。执行alt+ enter,然后要求重新运行或在固定的受影响的行上禁用Spring检查。在13.4更新之后,这似乎只是一个问题。


1

就我而言,我缺少在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>

并在应用程序上下文文件中:

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

添加此标签并运行maven来重建项目后,intellj desapears中的自动装配错误,并且Bean图标出现在左边缘: 在此处输入图片说明


1

我的不是在CrudRepository界面上添加@Repository,我正在观看的教程没有在STS上添加它,也没有抱怨。




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

我已经通过这种方式解决了这个问题。在IntelliJ中,您的所有软件包都应位于main / java的子软件包中。例如,我将所有包都放在src / main / java / com.misisol.watchStore /下,spring之后便可以找到我的bean。




0

有点晚了,但我希望它对其他人有帮助。

确保将@Service放在服务的实现类上

@Service
public class ServiceNameImpl implements ServiceName {

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

}

这就是我修复错误的方式。


0

我知道这是一个古老的问题,但是我没有找到能为我解决该问题的任何答案,因此我将提供解决方案。

注意:我认为可能是这个问题,但是我的问题与两次实现相同的接口无关。使用@Qualitier确实使我的问题消失了,但这是一个绷带,而不是一个适当的解决方案,因此我对此并不满意。

背景

我的任务是维护一个旧项目,该项目经历了不同版本的spring,并且仅针对单独的模块进行了更新,因此至少可以说需要重构。我最初得到了重复的bean问题,并且进行了一些修补工作,即使在只有一个bean的情况下,OP的问题和重复的bean问题之间的问题来回切换。导航到重复的bean总是去同一个类。

问题

该问题出现在一个@Repository班级中@Autowired,该@Service班级也具有@ComponentScan注释。我注意到我也有一个在基础包上application-config.xml做的弹簧,context:component-scan我相信这是旧版Spring中的原始方法。我正在通过在一个支持项目中同时使用旧分支和较新分支的一部分来创建新分支,该支持项目用于几年来开发的不同项目中,这就是为什么会有如此混合搭配的原因方法论。

简单的解决方案

由于@ComponentScan已经实现了更现代的使用方法,因此我删除了application-config.xml,问题就解决了。


0

以下为我工作:

  1. 查找实现提供错误的服务(接口)的所有类。
  2. 用@Service批注标记每个类,以将它们指示为业务逻辑类。
  3. 重建项目。

0

我可能会晚一点,但是花了几个小时并研究了这个问题。

我发现,在最新版本的IntelliJ 2020中, @ AutoWired是可选的,而基于构造函数的掺杂注入是更可取的。

我通过简单地从Service和Controller类中删除@AutoWired批注并使用基于构造函数的依赖项注入来解决该问题。

链接可能会有所帮助。

编码愉快!


0

我只有IntelliJ的2019.2.4版本的基于构造函数的依赖项注入的一项服务才遇到这个问题。我发现更改服务名称(shift + f6),然后放弃git级别的更改很有帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.