ChatGPT解决这个技术问题 Extra ChatGPT

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

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

这是此错误消息:

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

尝试使用这个:@SuppressWarnings("SpringJavaAutowiringInspection")
我的集成测试类有同样的错误。我认为使用 @SupressWarnings 注释是一个不错的解决方案。
我不得不使用@SuppressWarnings("SpringJavaAutowiredMembersInspection")
对于 IntelliJ IDEA 2017.3.1(终极版),使用 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
只需点击 alt + enter 出现警告,然后点击 rigth arrow 并选择 Suppress for class。 Idea 会自动添加右 @SuppressWarnings 注释

J
Jose Leon

我在 IntelliJ IDEA 13.1.4 上遇到了同样的问题,我通过删除 Spring facet(文件->项目结构)并让它只显示“检测”来解决它。


但是如果你真的忘记注释一个 bean 怎么办。你不会收到任何警告吗?
u
user3580264

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

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

或者,如果您有多个 @Autowired,则将 @SupressWarnings 注释添加到类中
l
lanoxx

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

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

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


T
Thiago Pereira

这里有同样的错误!

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

解决它只是从错误更改为警告(按 Alt + Enter)。


M
Maciej

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


删除方面并抑制警告或类似的“修复”似乎不合逻辑或不聪明,所以我试了一下。但我没有做最后一步。相反,我删除了我的 .iml 文件,选择在 pom.xml 文件的 maven 选项中重新导入,然后执行 ctrl + s 来重新生成 .iml。错误消失了。
A
Aleksey Samoylov

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


哪个中心柱?
@KuldeepYadav 与中央列他可能是指您选择要使用的模块的列。
j
jbarrameda

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


t
tomcyjohn

通过转到 File >> Project Structure >> Facets 然后将所有配置文件添加到 Spring Facet 解决了这个问题。之后,它开始检测 bean 所在的文件并能够对问题进行排序。 IntelliJ 提供此检查非常有价值,恕我直言,不应禁用。


我不认为 Spring 是一个可能的方面。你有什么版本的 Intellij?
@jDub9 它需要终极(付费)版本。免费版没有 Spring 集成。
i
i-bob

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


还要检查您的 application-properties.xml。检查行 context:component-scan base-package=”com.my.project” 是否不排除您引用的服务包。
我把你的代码放到我项目的“bec-job.iml”里面了,问题依旧存在?
您必须将 @SuppressWarnings("SpringJavaAutowiringInspection") 放在代码的红色突出显示的 @Autowired 部分的正上方。这样 IntelliJIdea 可以识别要抑制的警告。
您必须找到文件“application-properties.xml”,而不是“applicationContext-interface.xml”
@SuppressWarnings("SpringJavaAutowiringInspection") 对我来说似乎很老套,但它确实有效。多谢你们。
k
karl li

我有同样的问题。

https://i.stack.imgur.com/mGZeU.jpg

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

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

https://i.stack.imgur.com/TSHB2.png

添加上下文文件:

https://i.stack.imgur.com/TbiV8.png

完毕!

https://i.stack.imgur.com/6HNiF.jpg


u
user9869932

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

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

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

link 可能会有所帮助。

快乐编码!


此评论似乎已过时,因为 IntelliJ 现在还会在找不到通过构造函数注入的依赖项时发出警告。
S
Sruit A.Suk

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

尝试添加

@ComponentScan("path to respective Component") 

到父控制器。


v
vivekmore

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

你可以在下面检查这个

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

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


这在社区版上可用还是仅在终极版上可用?
T
Teocali

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


J
Jason D

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


d
demian

就我而言,我错过了在 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] />

https://i.stack.imgur.com/I6pst.png


R
Rejinderi

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


M
Milos Nikolik

你应该检查你是否在课堂上添加了@Component、@Repository 或类似的东西


M
Mar Villeneuve

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

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

@Service
public class ServiceNameImpl implements ServiceName {

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

}

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


D
Darrel Holt

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

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

背景

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

问题

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

简单的解决方案

由于已经实现了使用 @ComponentScan 的更现代的方法,我只是删除了 application-config.xml 并且问题得到了解决。


P
Pavel Vlasov

我解决了添加 Web 方面的问题。


l
lee
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 {

M
Mehrdad Sharifi

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


P
Ponleu

使用@Qualifier 注入 Bean 为我解决了这个问题。


A
Aleksander Burzec

我有类似的问题。我通过取消选中“处理显式注释的bean”选项来解决它(见下面的截图)。这个选项在 linux 上默认是启用的。现在 @Service 和 @Configurations 注释是可见的。 screenshot


t
tonderaimuchada

以下对我有用:

查找所有实现给出错误的服务(接口)的类。使用 @Service 注释标记每个类,以将它们指示为业务逻辑类。重建项目。


V
Vodzoo

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


c
cinqS

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

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

https://i.stack.imgur.com/seFzl.png

试一试,您会看到自动添加的 SuppressWarnings

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