intellij 错误地说没有为自动装配的存储库找到类型的 bean

Posted

技术标签:

【中文标题】intellij 错误地说没有为自动装配的存储库找到类型的 bean【英文标题】:intellij incorrectly saying no beans of type found for autowired repository 【发布时间】:2015-01-09 11:34:15 【问题描述】:

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

没有豆子?

正如您在下面看到的,它通过了测试?所以它必须是Autowired?

【问题讨论】:

IntelliJ 有时会给出误报自动连线错误。例如在 Spring Boot 应用程序中,很多配置隐藏在 EnableAutoConfiguration 后面。有一个未解决的问题。其他原因可能是 Spring facet 配置不正确。在这些情况下,我通常会降低检查的严重性,使其不那么突兀... 这个问题发生在我身上,因为我混合了 JUnit 4/Junit 5/Jupiter,用于我的 @Test 注释。将它们切换到 Jupiter 解决了自动连线错误。 我在 IntelliJ 2021.2.3 上,这种情况仍在发生。 【参考方案1】:

我在使用 @SpringBootApplication 注释创建 Spring Boot 应用程序时遇到了同样的问题。这个注解根据spring reference代表@Configuration@EnableAutoConfiguration@ComponentScan

正如预期的那样,新注释工作正常,我的应用程序运行顺利,但是,Intellij 一直抱怨未实现 @Autowire 依赖项。一旦我改回分别使用@Configuration@EnableAutoConfiguration@ComponentScan,错误就停止了。 Intellij 14.0.3(很可能还有早期版本)似乎尚未配置为识别 @SpringBootApplication 注释。

现在,如果这些错误让您感到非常困扰,那么请回到这三个单独的注释。否则,忽略 Intellij...您的依赖解析配置正确,因为您的测试通过了。

永远记住...

人永远大于机器。

【讨论】:

我还在用 2017.2 获得它,它是为终极许可证付费的。 对于较新版本的 IntelliJ(例如 2017),您必须启用 Spring Data 插件,然后您不需要上述任何解决方法。下面还有另一个答案告诉你如何做到这一点。 使用 IntelliJ 2018.2,使用 Spring Boot 2.0.5 和 @SpringBootApplication 我收到此错误。我遵循@Jaõs Matos 的建议,使用scanBasePackages 参数到@SpringBootApplication,并指定了应该扫描的包/命名空间。 在 2020.3、Spring Boot 2.3.7、Kotlin 1.4.21 中相同,对于 @Autowired lateinit var embeddedKafka:EmbeddedKafkaBroker 同上,版本 2021.1.2 终极版【参考方案2】:

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

我知道它应该在没有这个注释的情况下工作。但是如果你添加这个,IntelliJ 不会显示错误。

@Repository
public interface YourRepository ...
...

如果您使用带有扩展Repository 类的Spring Data,它将是冲突包。然后你必须明确地指明包裹。

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

【讨论】:

据此youtrack.jetbrains.com/issue/IDEA-148113 它已在版本 16 中修复...(屏住呼吸) @Component 似乎也可以工作。看起来只需要强制扫描接口/类 您不再需要添加@Repository。就在 Spring Data 插件上。 三年后又坏了 我使用 /@Mapper 作为我的映射器接口(mybatis)。 IDEA 抛出这个警告。我将其更改为 /@Repository 警告消失了。【参考方案3】:

我的 IntelliJ IDEA Ultimate 版本(2016.3.4 Build 163)似乎支持这一点。诀窍是您需要启用 Spring Data 插件。

【讨论】:

这也为我解决了这个问题——对于那些正确设置代码的人来说,这似乎是真正的问题! 不适用于 2017.2.7。插件已启用,但警告仍然存在。 在 iJ Ultimate 2018.2.5 中为我工作。 为 intellij idea Ultimate 2020 工作 支持这个,在 Idea Ultimate 2020.2 中就像一个魅力【参考方案4】:

有时你需要指出@ComponentScan 应该在哪里扫描组件。您可以通过将包作为此注释的参数传递来做到这一点,例如:

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

然而,正如已经提到的,@SpringBootApplication 注解替换了@ComponentScan,因此在这种情况下你必须这样做:

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

至少在我的情况下,Intellij 不再抱怨了。

【讨论】:

这绝对是更好、更清洁的解决方案,并且可以确认这消除了警告。谢谢! 在我的情况下,我有@SpringBootApplication(scanBasePackages="com.a.b, com.a.c"),虽然应用程序运行良好,但 intellij 不喜欢它。更改为 @SpringBootApplication(scanBasePackages="com.a.b", "com.a.c") 已为我修复! 这是迄今为止最好的解决方案,因为它可以在 IDE 之间移植并清楚地传达开发人员的意图。 @GriffoGoes 的建议解决了我的问题,因为我使用的是多模块结构,这是我最好的解决方案 这应该是公认的答案。清楚地说明根本原因和解决方案。【参考方案5】:

我总是通过以下方式解决这个问题。 Settings>Inspections>Spring Core>Code 比你从错误转向警告严重性选项

【讨论】:

我一直使用这个解决方案,直到在 Spring 上进行修复:youtrack.jetbrains.com/issue/IDEA-182912【参考方案6】:

我正在使用 spring-boot 2.0 和 intellij 2018.1.1 终极版,我遇到了同样的问题。

我通过将@EnableAutoConfiguration 放在主应用程序类中解决了

@SpringBootApplication
@EnableAutoConfiguration
class App
/**/

【讨论】:

这对我来说也“有效”,但随后 intellij 抱怨:Redundant declaration: @SpringBootApplication already applies @EnableAutoConfiguration¯\_(ツ)_/¯ 这是冗余声明:@SpringBootApplication 已应用 @EnableAutoConfiguration【参考方案7】:

检查您是否错过了服务类中的@Service 注释,对我来说就是这种情况。

【讨论】:

这就是我的情况。确保我们在服务类中有“@Service”,在存储库类中有“@Repository”。【参考方案8】:

@Component@configuration 放入您的bean 配置文件似乎可行,例如:

@Configuration
public class MyApplicationContext 
    @Bean
    public DirectoryScanner scanner() 
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    


@Component
public class MyApplicationContext 
    @Bean
    public DirectoryScanner scanner() 
        return new WatchServiceDirectoryScanner("/tmp/myDir");
    

【讨论】:

【参考方案9】:

配置应用上下文,一切都会好的。

【讨论】:

我在多模块项目中有一个服务,将 Spring Application Context 添加到有问题的模块中解决了问题 我认为问题在于我在一个项目中有两个 @SpringBootApplication 注释(一个用于数据加载器,一个用于实际项目)。我按照您的建议明确定义了两个不同的应用程序上下文,正如您在屏幕截图中显示的那样,然后错误就消失了。谢谢! 在Project setting -> Facets中添加应用上下文文件很有用【参考方案10】:

在类级别使用@EnableAutoConfiguration 注释和@Component。它会解决这个问题。

例如:

@Component
@EnableAutoConfiguration  
public class ItemDataInitializer  

    @Autowired
    private ItemReactiveRepository itemReactiveRepository;

    @Autowired
    private MongoOperations mongoOperations;

【讨论】:

【参考方案11】:

您是否检查过在服务实现之上使用了@Service 注释? 它对我有用。

import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserServices 

【讨论】:

【参考方案12】:

对我来说,解决方案是将@EnableAutoConfiguration 放在@SpringBootApplication 下的Application 类中,因为它是多余的,所以它会加下划线。删除它,瞧,所有关于丢失 bean 的警告都消失了!傻春……

【讨论】:

我太绝望了,我实际上尝试了这个 :-) 我需要将 bean 添加到我的 CoreApplication 类【参考方案13】:

如果您不想仅仅为了让您的 IDE 满意而对代码进行任何更改。我通过将所有组件添加到 Spring facet 来解决它。

    创建一个名称为“服务、处理器和路由器”或您喜欢的任何名称的组; 删除并重新创建“Spring 应用程序上下文”,使用您之前创建的组作为父组。

【讨论】:

【参考方案14】:

只要你的测试通过了你就很好,点击alt + enter,将光标移到错误上并在第一个项目的子菜单中你会发现Disable Inspection选择那个

【讨论】:

谢谢。顺便说一句,有没有办法在 IntelliJ 设置的一个视图中查看所有非默认更改(所以你知道你做了什么)?【参考方案15】:

最后一条重要信息 - 添加 ComponentScan 以便应用了解它需要连接的内容。这与这个问题的情况无关。但是,如果根本没有执行@autowiring,那么这很可能是您的解决方案。

@Configuration
@ComponentScan(basePackages = 
    "some_package",
)
public class someService 

【讨论】:

这是有道理的,对我有用。为什么要关闭警告?警告应该按预期工作!【参考方案16】:

当它出现在 IntelliJ v.14 中时,我正在使用此注释来隐藏此错误:

@SuppressWarnings("SpringJavaAutowiringInspection")

【讨论】:

自动装配到构造函数时为@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")【参考方案17】:

我在 Spring Boot 应用程序中遇到了类似的问题。该应用程序利用 Feign(HTTP 客户端从带注释的接口合成请求)。使用@FeignClient 注释的接口SomeClient,Feign 生成实现该接口的运行时代理类。当某些 Spring 组件尝试自动装配 SomeClient 类型的 bean 时,Idea 抱怨找不到 SomeClient 类型的 bean,因为项目中实际上不存在真正的类,并且没有教导 Idea 以任何方式理解 @FeignClient 注释。

解决方案:用@Component注释接口SomeClient。 (在我们的例子中,我们不直接在SomeClient 上使用@FeignClient 注释,而是使用元注释@OurProjectFeignClient,它被注释为@FeignClient,并添加@Component 注释也可以。)

【讨论】:

是的,在界面中添加@Component 即可解决问题。但我认为这不是正确的方法......在我看来,这是 IntelliJ IDEA 中的一个错误,或者不是那么难 IntelliJ IDEA 还没有为更新的 Feign 版本做好准备。它在没有@Component 的情况下工作,在错误的伪装版本中(@FeignClient 注释在org.springframework.cloud.netflix.feign 而不是org.springframework.cloud.openfeign - 也许这是问题的原因?)。您是否为此找到了更多详细信息(可能是错误票)? 不,我没有,虽然我的情况(没有@Component 无法工作)是来自org.springframework.cloud.netflix.feign@FeignClient)包。 JetBrains 错误跟踪器的问题在这里:youtrack.jetbrains.com/issue/IDEA-168155【参考方案18】:

你需要做的是添加

@ComponentScan("package/include/your/annotation/component")AppConfiguration.java

由于我认为您的AppConfiguraion.java 的包比您的注释组件(@Service、@Component...)的包更深

"package/include/your/annotation/component/deeper/config"

【讨论】:

@ComponentScan("package.include.your.annotation.component") !【参考方案19】:

我在我的应用程序中遇到了类似的问题。 当我添加注释时,不正确的突出显示消失了。

@ContextConfiguration(classes = ...)

【讨论】:

仅适用于测试包!【参考方案20】:

在我的情况下,我尝试@Autowired 的目录不在同一级别,

在同结构层设置后,错误消失了

希望它可以帮助一些人!

【讨论】:

【参考方案21】:

IntelliJ IDEA Ultimate

将主类添加到 IntelliJ Spring Application Context,例如 Application.java

File -> Project Structure..

左侧: 项目设置 -> 模块

右侧:在您的包结构中查找 Spring 并添加 + Application.java

【讨论】:

等于U.V.回答【参考方案22】:

只需两步即可

    添加休眠核心依赖 将@Autowired 更改为@Resource
==>> change @Autowired to  @Resource

【讨论】:

解释你的答案。【参考方案23】:

只需在您的 POJO 中添加以下两个注释。

@ComponentScan
@Configuration
public class YourClass 
    //TODO

【讨论】:

添加 @ComponentScan 对我有用。谢谢你。我正在使用版本 2020.3.1【参考方案24】:

作为 IntelliJ (IDE) 和开发环境之间的大多数同步错误。

特别是,如果您有自动化测试或构建一直通过绿色。

使缓存无效并重新启动解决了我的问题。

【讨论】:

【参考方案25】:

我在 Spring Boot 应用程序中解决此问题的方法是打开 Spring 应用程序上下文并手动为丢失的自动装配 bean 添加类!

(通过项目结构菜单或spring工具窗口访问...编辑“Spring Application Context”)

所以 SpringApplicationContext 不仅仅包含我的 ExampleApplication spring 配置,它还包含缺少的 Bean:

SpringApplicationContext:

ExampleApplication.java MissingBeanClass.java

等等:错误信息消失了!

【讨论】:

【参考方案26】:

这似乎仍然是最新 IntelliJ 中的一个错误,并且与可能的缓存问题有关?

如果将@Repository注解添加为上面提到的mk321,保存,然后删除注解并再次保存,这样就解决了问题。

【讨论】:

【参考方案27】:

有时 - 在我的情况下 - 原因是错误的导入。我不小心导入了

import org.jvnet.hk2.annotations.Service

而不是

import org.springframework.stereotype.Service

通过盲目接受 Idea 建议的导入中的第一选择。第一次发生时花了我几分钟:-)

【讨论】:

【参考方案28】:

要完成这项工作,您需要做的就是以下代码:

@ComponentScan
public class PriceWatchTest

    @Autowired
    private PriceWatchJpaRepository priceWatchJpaRepository;
...
...

【讨论】:

【参考方案29】:

我只需要使用@EnableAutoConfiguration 来解决它,但是这个错误对功能没有影响。

【讨论】:

【参考方案30】:

可以通过将@EnableAutoConfiguration 放在spring boot 应用程序主类上来解决。

【讨论】:

以上是关于intellij 错误地说没有为自动装配的存储库找到类型的 bean的主要内容,如果未能解决你的问题,请参考以下文章

我不能在春天自动装配存储库

如何在 spring-servlet.xml 中自动装配 crud 存储库?

在 Spring Boot 应用程序的 JUnit 测试中,自动装配的 JPA 存储库没有合格的 bean

Spring Boot 测试不会自动装配所有依赖项

使用 @DataJpaTest 的 Spring 测试无法使用 @Repository 自动装配类(但使用接口存储库可以工作!)

IntelliJ IDEA 2017版 spring-boot2.0.2 自动配置Condition