IntelliJ错误地指出没有找到自动装配存储库的类型

268

我创建了一个简单的单元测试,但IntelliJ不正确地将其突出显示为红色,并标记为错误。

没有bean?

这是一张图片,请查看图片以获取更多信息

正如您在下面所看到的,测试通过了吗? 所以必须是自动装配(Autowired)?

这是一张图片,请查看图片以获取更多信息


5
IntelliJ有时会给出错误的自动装配错误提示,例如在Spring Boot应用程序中,其中许多配置都隐藏在EnableAutoConfiguration之后。目前已有相关问题的开放式问题跟踪。其他原因可能是Spring Facet配置不正确。在这些情况下,我通常会降低检查的严重性,以使其不那么突兀... - Bohuslav Burghardt
这个问题发生在我身上,是因为我混用了 JUnit 4/Junit 5/Jupiter 的 @Test 注解。将它们切换到 Jupiter 可以解决自动装配错误。 - Janac Meena
6
我使用的是 IntelliJ 2021.2.3,仍然出现这种情况。 - Woodchuck
3
仍然发生在 IntelliJ IDEA 2022.1(旗舰版)中。相当令人沮丧。 - JavaQuest
仍然发生在IntelliJ IDEA 2023.1.2(Ultimate Edition)中,在我的特定情况下,我在测试中使用了一个带有@Service注解的类,并且在本地使用@Autowired(required = false)作为一种解决方法,因为测试运行良好。 - S. H.
51个回答

288

当使用@SpringBootApplication注解创建一个基于Spring Boot的应用程序时,我也遇到了同样的问题。据spring参考文档所述,该注解代表@Configuration@EnableAutoConfiguration@ComponentScan三个注解。

预期,新的注解可以正常工作,我的应用程序也顺利运行,但是,Intellij一直抱怨无法满足@Autowire依赖项。只要我改回分别使用@Configuration@EnableAutoConfiguration@ComponentScan,错误就停止了。看起来Intellij 14.0.3(以及很可能是早期版本)尚未配置识别@SpringBootApplication注解。

目前,如果这些错误让你很烦恼,那么请回到这三个单独的注解。否则,忽略Intellij,因为你的依赖关系是正确配置的,因为你的测试通过了。

永远记住...

人始终比机器更伟大。


82
我仍在使用2017.2版本,而且这是已购买的终极许可证。 - Thomas Carlisle
5
对于较新版本的IntelliJ(例如2017年),您需要启用Spring Data插件,然后您就不需要使用上述任何解决方法。下面还有另一个答案告诉您如何做到这一点。 - PanHrabia
9
同样适用于2020.3版本的Spring Boot 2.3.7和Kotlin 1.4.21,用于@Autowired的内容为: lateinit var embeddedKafka: EmbeddedKafkaBroker - Pawel
10
同样是这个版本,2021.1.2 旗舰版。 - mal
6
很遗憾地说,这在2022.2终极版仍然发生。 - Cécile Fecherolle
显示剩余20条评论

99

在存储库类上添加Spring注释@Repository

我知道这个注释不是必须的,但是如果添加了它,IntelliJ就不会显示错误。

@Repository
public interface YourRepository ...
...

如果您使用Spring Data并扩展Repository类,将会发生包冲突。那么您必须直接指定包。

import org.springframework.data.repository.Repository;
...

@org.springframework.stereotype.Repository
public interface YourRepository extends Repository<YourClass, Long> {
    ...
}

接下来,您可以自动装配您的存储库,而不会出现错误。

@Autowired
YourRepository yourRepository;

我猜你可能尝试注册存储库两次,这不是一个好的解决方案。但它对我有效且没有显示错误。

也许在新版的IntelliJ中可以修复:https://youtrack.jetbrains.com/issue/IDEA-137023


3
根据此链接 https://youtrack.jetbrains.com/issue/IDEA-148113 ,问题已在16版本中得到修复...(屏住呼吸)。 - ismoore999
@Component 似乎也可以工作。看起来只需要强制扫描接口/类即可。 - Brett
你不再需要添加 @Repository 注解了,只需使用 Spring Data 插件即可。 - Shin Kim
19
三年后,它又坏了。 - garyM
我在我的映射器接口(MyBatis)中使用了 /@Mapper。 IDEA 抛出了警告。我将其更改为 /@Repository,警告消失了。 - bzuo
1
2020.3.1版本仍然存在相同的错误(使用默认参数值的Kotlin可以正常运行,但IntelliJ会显示错误)。 - spyro

44
有时您需要指示 @ComponentScan 应扫描哪些组件。您可以通过将包作为此注释的参数传递来实现,例如:

有时需要指定 @ComponentScan 扫描组件的位置。您可以通过将要扫描的包作为该注解的参数传递来实现,例如:

@ComponentScan(basePackages={"path.to.my.components","path.to.my.othercomponents"})

然而,正如已经提到的那样,@SpringBootApplication注解替代了@ComponentScan,因此在这种情况下,您必须做相同的事情:

@SpringBootApplication(scanBasePackages={"path.to.my.components","path.to.my.othercomponents"})

至少在我的情况下,Intellij停止了抱怨。


2
这绝对是更好、更干净的解决方案,可以确认这已经消除了警告。谢谢! - Dave Goodchild
2
在我的情况下,我有@SpringBootApplication(scanBasePackages={"com.a.b, com.a.c"}),尽管应用程序运行良好,但Intellij不喜欢它。将其更改为@SpringBootApplication(scanBasePackages={"com.a.b", "com.a.c"})对我有帮助! - GriffoGoes
1
这绝对是最好的解决方案,因为它在IDE之间是可移植的,并且清晰地传达了开发人员的意图。 - MusikPolice
我正在使用ultimate 2019.3.1 spring boot 2.2.1和java 11.0.4。问题仍然存在于单元测试文件中。 - garyM
2
@GriffoGoes所建议的解决方案解决了我的问题,因为我使用了多模块结构,这是我最好的解决方案。 - Juan Monsalve
1
这应该是被接受的答案。明确说明根本原因和解决方案。 - Caffeine Coder

42

我的 IntelliJ IDEA Ultimate 版本为 2016.3.4 Build 163,似乎支持这个功能。关键是你需要启用 Spring Data 插件。

在这里输入图片描述


这对我也解决了问题 - 看起来这可能是任何其他代码设置正确的人真正的问题! - Matsu Q.
19
2017.2.7版本无法正常工作。插件已启用,但警告仍然存在。 - brainfrozen
在我的iJ Ultimate 2018.2.5版本中有效。 - JL_SO
适用于IntelliJ IDEA Ultimate 2020。 - axnet
点赞,这在 Idea Ultimate 2020.2 中非常好用。 - toucheqt
4
即使启用了插件,它仍然无法正常工作。 - Arefe

39
我通常通过以下方式解决这个问题: 设置>检查>Spring Core>代码,然后将严重性选项从错误更改为警告。

输入图像描述


2
我选择了这个解决方案,直到Spring修复此问题:https://youtrack.jetbrains.com/issue/IDEA-182912 - Garry Polley
5
在 IntelliJ 2021.3 中,此设置已更名为“Spring bean 组件中的错误注入点自动装配”。 - Jan

26

我正在使用spring-boot 2.0和Intellij 2018.1.1 ultimate版本,我遇到了同样的问题。

我通过将@EnableAutoConfiguration放置在主应用程序类中解决了这个问题。

@SpringBootApplication
@EnableAutoConfiguration
class App{
/**/
}

29
这对我也"有用",但是IntelliJ会抱怨:冗余声明:@SpringBootApplication已经应用了@EnableAutoConfiguration¯\(ツ) - Michael
这是冗余声明:@SpringBootApplication已经应用了@EnableAutoConfiguration - Arefe
在我使用@EnableAutoConfiguration注解的类上,IntelliJ报错,但是这个问题也被修复了。 - SydMK
@Arefe 这是冗余的,但可以解决“未找到自动装配”错误。这似乎是IntelliJ的一个bug...我已经将此注释放在了另一个类上,而不是@SpringBootApplication,以修复所有错误。 - Jos

23

请检查您的服务类是否缺少@Service注释,这也是我遇到的情况。


对我而言,确保我们的服务类中有'@Service',仓库类中有'@Repository'。 - stoneshishang

13

配置应用程序上下文即可解决问题。

在此输入图片描述


我在多模块项目中有一个服务,将Spring应用程序上下文添加到相关模块已解决该问题。 - Vadym Tyemirov
我认为在我的情况下问题是我在一个项目中有两个@SpringBootApplication注释(一个用于数据加载器,另一个用于实际项目)。我按照您的建议明确定义了两个不同的应用程序上下文,就像您在屏幕截图中展示的那样,然后错误消失了。谢谢! - Simon
在项目设置 -> Facets 中添加应用程序上下文文件非常有用。 - ryanlee

12
使用@Component在类级别上注释,同时使用@EnableAutoConfiguration。它将解决此问题。 例如:
@Component
@EnableAutoConfiguration  
public class ItemDataInitializer  {

    @Autowired
    private ItemReactiveRepository itemReactiveRepository;

    @Autowired
    private MongoOperations mongoOperations;
}

12

你是否确认在你的服务实现类上使用了 @Service 注解?这对我有用。

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserServices {}

移除它对我来说起作用了 :O - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接