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
使用 @DataJpaTest 的 Spring 测试无法使用 @Repository 自动装配类(但使用接口存储库可以工作!)