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

当我在类中使用 Spring 的 @Autowired注释时,IntelliJ IDEA 显示出了错误,但是这个类没有任何问题。

下面是这个错误消息:

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

147866 次浏览

确保您的 Springbean 定义是正确的。有时候,应用程序工作得很好,它只是在 IDE 中显示一个错误,如果您定义了 Spring 方面,请检查您的项目‘ iml’文件。

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

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

这里也有同样的错误!

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

解决它只是从错误变成警告(按 Alt + 回车)。

我解决了这个问题,添加了一个 Web 方面。

我在 IntelliJ IDEA 13.1.4中遇到了同样的问题 我通过删除 Spring facet (File-> Project Architecture)解决了这个问题,让它只显示“检测”。

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

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

看起来像是可见性问题-父控制器看不到您试图连接的组件。

试着加上

@ComponentScan("path to respective Component")

到父控制器。

在我的例子中,我错过了在 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 以重新构建项目之后,Intelligj desapears 中的自动连接错误和 bean 图标出现在左边的空白处: enter image description here

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

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

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

我的是因为没有在 CrudRepository 接口上添加@Repository,我看的教程没有在 STS 上添加它,它也没有抱怨。

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

你可以看看这下面

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

有时,我们需要显式地告诉 IDE,Spring 配置来自一个依赖项(项目类路径中的 jar)

File-> Projectstruct- > Module-> + (在中间列)-> Spring-> OK

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

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 {

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

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

我也有过类似的问题。我解决这个问题的方法是取消选中“ Process 顯式注释 bean”选项(参见下面的截图)。这个选项默认情况下在 linux 上是启用的。 现在可以看到@Service 和@Configuration 注释。 截图

通过文件 > > 项目结构 > > Facets,然后将所有配置文件添加到 Spring Facet,解决了这个问题。 之后,它开始检测 bean 所在的文件,并能够对问题进行排序。 IntelliJ 给这张支票是相当有价值的,恕我直言,不应该被禁用。

我通过添加抑制警告修正了这个问题:

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

有点晚了,但我希望能帮到别人。

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

@Service
public class ServiceNameImpl implements ServiceName {


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


}

我就是这样修正错误的。

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

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

背景

我的任务是维护一个老项目,这个项目已经经历了 Spring 的不同版本,并且只针对单独的模块进行了更新,所以至少需要重构。我最初遇到了复制 bean 的问题,并且在 OP 的问题和复制 bean 的问题之间来回修改了问题,尽管只有一个 bean; 导航到复制 bean 总是到同一个类。

问题

这个问题出现在 @Repository类中,@Autowired@Service类中的 @Autowired,而 @Service类也有 @ComponentScan注释。我注意到我还有一个 Spring application-config.xml,它在基础软件包上运行 context:component-scan,我相信这是旧版本 Spring 的原始方法。我当时正在创建一个新的分支,在一个支持项目中分别使用一个旧的分支和一个新的分支的一部分,这个支持项目用于几年开发的不同项目,这就是为什么会有这样一个混合和匹配的方法。

简单的解决办法

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

以下几点对我很有效:

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

我可能会迟到一会儿,但是在花了几个小时研究这个问题之后。

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

我解决了这个问题,只需从 Service and Controller 类中删除 @ AutoWired注释,并使用基于构造函数的依赖注入。

这个 链接可能会有帮助。

编码愉快!

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

我也有同样的问题。

enter image description here

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

简而言之,File-> ProjectArchitecture (something;)-> Module-> (select the module)-> Spring-> (click’+’to add context)-> OK

enter image description here

添加上下文文件:

enter image description here

搞定!

enter image description here

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

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

enter image description here

尝试它们,您将看到自动添加 SuppressWarnings

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