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

IntelliJ IDEA shows errors when using Spring's @Autowired annotation

提问人:Vainlyh 提问时间:1/24/2014 最后编辑:naXa stands with UkraineVainlyh 更新时间:11/15/2023 访问量:184243

问:

当我在类中使用 Spring 的注释时,IntelliJ IDEA 显示错误,但该类运行没有任何问题。@Autowired

这是以下错误消息:

Autowired 成员必须在有效的 spring 中定义 豆类(@Component/@Service等)少...(Ctrl+F1 组合键)检查自动接线 Bean 类中的问题。

弹簧 弹簧-MVC Intellij-IDEA 警告 INTELLIJ-检查

评论

0赞 Kevin Wittek 1/15/2015
我的集成测试类也有同样的错误。我认为使用 @SupressWarnings 注释是一个很好的解决方案。
0赞 Adam 11/3/2016
Intellij 2016.2 正在用我的 spring boot / spring data 项目来做到这一点。Intellij 正在查看哪个文件以确定存在哪些 bean?
0赞 Gwaptiva 12/8/2017
他们至少可以排除或优化一个用例,那就是当相关的被检查类是抽象的时。我经常遇到这样的问题,我的抽象超类具有 SomeBean<T> 类型的字段或参数,其中 <T> 在子类中指定
8赞 lealceldeiro 12/22/2017
对于 IntelliJ IDEA 2017.3.1(旗舰版),请使用@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
2赞 alaster 8/28/2018
只需点击警告,然后选择 .Idea 将自动添加正确的注释alt + enterrigth arrowSuppress for class@SuppressWarnings

答:

5赞 i-bob 1/24/2014 #1

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

评论

0赞 i-bob 1/24/2014
还要检查您的应用程序属性 .xml。检查行 context:component-scan base-package=“com.my.project” 是否不排除您引用的服务包。
0赞 Vainlyh 1/24/2014
我把你的代码放到我项目的“bec-job.iml”中,但问题仍然存在。而且我在我的项目中找不到文件名是“applicationContext-interface.xml”,你能详细说说吗?
0赞 i-bob 1/24/2014
您必须将 @SuppressWarnings(“SpringJavaAutowiringInspection”) 放在代码@Autowired部分的正上方,该部分突出显示为红色。这样,IntelliJIdea 就可以识别要抑制的警告。
0赞 i-bob 1/24/2014
您必须找到文件“application-properties.xml”,而不是“applicationContext-interface.xml”
1赞 Minras 4/18/2014
那个@SuppressWarnings(“SpringJavaAutowiringInspection”)对我来说似乎很骇人听闻,但它有效。谢谢大家。
1赞 Teocali 3/5/2014 #2

我遇到了同样的问题。我的是因为包含自动连线引用的 bean 不是 Spring 组件(它是一个 EJB),而是得到了一个允许使用自动布线的 SpringBeanAutowiringInterceptor 拦截器。我认为 Intellij 在其自动接线检查中没有考虑这种可能性。

2赞 Jason D 7/31/2014 #3

我也有这个问题。 执行 +,然后要求在受影响的线路上重新运行或禁用 Spring 检查,修复了它。 这似乎只是在 13.4 更新后才成为一个问题。altenter

24赞 Thiago Pereira 8/15/2014 #4

这里有同样的错误!

似乎 Intellij 无法验证类实现是@Service还是@Component。

只需从“错误”更改为“警告”(按Alt + Enter)即可解决它。

评论

8赞 Honza Zidek 5/17/2023
“解决它只是从错误更改为警告”。你不能称之为“解决方案”。
35赞 Jose Leon 1/20/2015 #5

我在使用 IntelliJ IDEA 13.1.4 时遇到了同样的问题 我通过删除 Spring facet(File->Project Structure)并让它只显示“检测”来解决它。

评论

52赞 Cleankod 11/22/2015
但是,如果您真的忘记注释 bean 怎么办?你不会收到任何警告吗?
1赞 Charing Lau 6/2/2023
但是 Maven->Reload 所有 Maven 项目都会再次出现同样的问题。
7赞 jbarrameda 6/26/2015 #6

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

21赞 Maciej 7/15/2015 #7

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

评论

13赞 ChiefTwoPencils 10/7/2015
删除分面并禁止警告或类似的“修复”似乎不合逻辑或不明智,所以我试了一下。但我没有做最后一步。相反,我删除了我的文件,在文件的 maven 选项中选择重新导入,并重新生成了 .错误消失了。.imlpom.xmlctrl + s.iml
2赞 Eugene Karasev 10/27/2015 #8

这似乎是可见性问题 - 父控制器看不到您尝试连接的组件。

尝试添加

@ComponentScan("path to respective Component") 

到父控制器。

1赞 demian 2/1/2016 #9

就我而言,我缺少在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 中的 Autowired 错误会消失,并且 Bean 图标会出现在左边距中:enter image description here

25赞 lanoxx 4/21/2016 #10

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

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

有时,如果已声明 Bean,IntelliJ 无法解析,例如,当 Bean 被有条件地包含并且条件解析在运行时动态发生时。在这种情况下,IntelliJ 的静态代码分析器似乎无法检测到 bean。

1赞 Rejinderi 4/29/2016 #11

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

2赞 vivekmore 6/4/2016 #12

确保您的 IntelliJ Idea (IDE) 了解正在检查模块的所有必要 spring 配置。

您可以在

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

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

评论

1赞 Archimedes Trajano 10/18/2017
这是在社区版上可用还是仅在终极版上可用?
15赞 Aleksey Samoylov 8/11/2016 #13

文件 -> ProjectStructure -> 模块 -> +(在中央列中) -> Spring ->确定

评论

1赞 Kuldeep Yadav 6/25/2020
哪个中央柱?
0赞 jwenting 6/2/2021
@KuldeepYadav中心列,他可能是指您选择要使用的模块的列。
1赞 MNJ 2/9/2017 #14

您应该检查课程中是否添加了@Component、@Repository或类似内容

0赞 lee 9/28/2017 #15
eg1:
director:Settings - 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赞 Mehrdad Sharifi 2/24/2018 #16

我已经以这种方式解决了这个问题。 在 IntelliJ 中,所有包都应该位于一个子包中,该子包是 main/java 的子包。 例如,我把我所有的包都放在 src/main/java/com.misisol.watchStore/ 下,然后 spring 可以找到我的 bean。

0赞 Ponleu 3/11/2018 #17

Inject Bean with @Qualifier为我解决了这个问题。

0赞 Aleksander Burzec 3/12/2018 #18

我有类似的问题。我通过取消选中“处理显式注释的豆子”选项解决了它(见下面的屏幕截图)。默认情况下,此选项在 Linux 上处于启用状态。 现在可以看到@Service和@Configurations注释。截屏

6赞 tomcyjohn 5/10/2018 #19

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

评论

0赞 wheeleruniverse 12/4/2019
我不认为 Spring 是一个可能的 Facet。您拥有哪个版本的 Intellij?
1赞 jwenting 6/2/2021
@jDub9它需要终极(付费)版本。免费版本没有 Spring 集成。
41赞 user3580264 8/2/2018 #20

我通过添加 supress 警告来修复它:

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

评论

0赞 Jose Rui Santos 9/4/2021
或者,如果有多个@Autowired,则将注释添加到类中@SupressWarnings
16赞 Honza Zidek 5/17/2023
你不能称之为“解决方案”。
1赞 Mehdi Charife 11/2/2023
@HonzaZidek 是的,这就是为什么我投了反对票,并标记了这个答案,以及这个问答中的许多其他答案,因为“不是一个答案”。
1赞 user16217248 11/3/2023
@MehdiCharife 您不应为此目的使用“not an answer”标志。这确实试图回答这个问题。只有当答案甚至没有尝试回答问题时,您才应标记为 NAA,例如,如果它是后续问题或“谢谢”评论。
1赞 Mehdi Charife 11/3/2023
@user16217248 我不认为这个答案试图回答“如何解决导致警告的问题”的问题。相反,它试图回答“如何抑制此警告”的不同问题。
1赞 Mar Villeneuve 3/30/2019 #21

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

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

@Service
public class ServiceNameImpl implements ServiceName {

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

}

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

1赞 Darrel Holt 10/18/2019 #22

我知道这是一个老问题,但我还没有遇到任何为我解决这个问题的答案,所以我将提供我的解决方案。

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

背景

我的任务是维护一个旧项目,该项目经历了不同版本的 spring,并且只针对单独的模块进行了更新,因此至少可以说,事情需要重构。我最初遇到了重复的 bean 问题,并且即使只有一个 bean,也通过修补在 OP 的问题和重复的 bean 问题之间来回更改问题;导航到重复的 Bean 总是转到同一个类。

问题

该问题存在于一个类中,该类也具有注释。我注意到我还有一个 spring 在基础包上做一个,我相信这是旧版本 Spring 的原始方法。我正在创建一个新分支,在一个支持项目中采用旧分支和新分支的一部分,该项目用于几年来开发的不同项目,这就是为什么有如此混合和匹配的方法。@Repository@Autowired@Service@ComponentScanapplication-config.xmlcontext:component-scan

简单的解决方案

由于已经实施了更现代的使用方法,我刚刚删除了它,问题就解决了。@ComponentScanapplication-config.xml

1赞 tonderaimuchada 3/25/2020 #23

以下内容对我有用:

  1. 查找所有实现 service(interface) 的类,该类会给出错误。
  2. 用 @Service 注释标记每个类,以将它们指示为业务逻辑类。
  3. 重新生成项目。
6赞 Shariq Shaikh 7/21/2020 #24

我可能有点晚了,但在花了几个小时研究这个问题之后。

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

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

链接可能会有所帮助。

祝您编码愉快!

评论

1赞 Markus Rohlof 11/17/2021
这个评论似乎已经过时了,因为 IntelliJ 现在也会在找不到通过构造函数注入的依赖项时发出警告。
0赞 Vodzoo 8/8/2020 #25

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

9赞 karl li 10/4/2021 #26

我有同样的问题。

enter image description here

我认为修复它的正确方法是告诉 Intellij 找到正确的 Spring 上下文,而不是“抑制警告”。

简而言之,File -> ProjectStructure(⌘;) -> Modules -> (选择模块) -> Spring -> (点击'+'添加上下文) -> OK

enter image description here

添加上下文文件:

enter image description here

做!

enter image description here

0赞 cinqS 10/8/2021 #27

对于那些正在使用 IDEA 的用户,您可以简单地删除您知道的那些警告。

在 mac 中,将你的诅咒移动到红色波浪线,按 option+enter(使用 Windows 时为 alt+enter),你会看到建议:

enter image description here

尝试它们,你会看到自动添加SuppressWarnings

记住,总是给出很好的解决方案。option+enter

-1赞 SatyaG 3/19/2023 #28

我在 IntelliJ 上通过向我的类添加注释解决了这个问题,例如

@Repository
@Service
1赞 boardtc 4/19/2023 #29

抑制警告气味可能不起作用,因为警告可能指示实例未注入,即它为 null。

如果您使用的是 Spring Boot:

  • 对我有用的是用 @SpringBootTest(ClassName.class) 注释我的测试类,其中 ClassName ><替换为被测试类的名称。
  • 注释的工作原理是创建将在测试中使用的 ApplicationContext,从而识别@autowired注释
1赞 naresh p 5/24/2023 #30

通过在类上方添加 @SpringBootTest 来解决此问题enter image description here

评论

1赞 alea 5/28/2023
不应在代码中添加图像,而应在代码中添加图像。如果将代码添加为文本,则其他人可以搜索它并从中复制。
1赞 Léo Freitas 6/22/2023 #31

将这两个注解放在单元测试类的顶部:

@SpringBootTest
@ExtendWith(SpringExtension.class)
class VerificationServiceTest {
    @Autowired
    private VerificationService service;
    @Test
    void matchUserBiometric() {
        service. // some method  / property
    }
}

出现此错误是因为 Spring 容器上没有服务类的实例,因此基本上当您尝试运行测试时会出现空点,您需要初始化 Spring,然后您的类的实例将可用。

0赞 narancs 11/15/2023 #32

显示的错误是指当您尝试将有效类转换为本身不是有效 Spring 的类时的情况。@Autowire@Bean@Bean

首先,通过使用相关的 Spring Stereotype: 或它的专用化(如 、 或 )来注释它,确保您尝试将 Bean 自动连接到其中的类是有效的 Spring Bean。根据 Spring Framework 文档(参见此处),用 或它的任何专用化注释的类是:@Component@Controller@Repository@Service@Component

[...]在使用基于注释的配置和类路径扫描时被视为自动检测的候选项。

在某些情况下,可能会发生 IntelliJ Spring 插件无法解析依赖关系树的情况。如果您确定是 IDE 搞砸了,您可以尝试:

  • 删除本地存储库中的文件夹,然后转到并重新加载项目.ideaFile -> Invalidate Caches