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

问题描述 投票:101回答:25

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

没豆子?

如下所示,它通过了测试?那么必须是Autowired?

java spring intellij-idea annotations autowired
25个回答
140
投票

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

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

现在,如果错误打扰你那么多,那么回到那三个单独的注释。否则,忽略Intellij ...您的依赖项解析已正确配置,因为您的测试通过了。

总记得...

人永远比机器大。


2
投票

最后一条重要信息 - 添加ComponentScan,以便应用程序知道它需要连接的东西。这与此问题的情况无关。但是,如果根本没有执行@autowiring那么这可能是你的解决方案。

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

2
投票

你需要做的是添加

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

因为我认为你的AppConfiguraion.java包比你的注释组件(@ Service,@ Component ...)的包更深,

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


2
投票

我的申请中遇到了类似的问题。当我添加注释时,不正确的突出显示消失了。

@ContextConfiguration(classes = {...})

2
投票

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

@SuppressWarnings("SpringJavaAutowiringInspection")

2
投票

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

解决方案:使用SomeClient注释接口@Component。 (在我们的例子中,我们不直接在@FeignClient上使用SomeClient注释,我们宁愿使用注释@OurProjectFeignClient的metaannotation @FeignClient并添加@Component注释也适用。)


1
投票

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

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


1
投票

您需要做的就是使用以下代码:

@ComponentScan
public class PriceWatchTest{

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

1
投票

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


1
投票

可以通过在Spring启动应用程序主类上放置@EnableAutoConfiguration来解决它。


1
投票

对我来说,解决方案是将@EnableAutoConfiguration放在@SpringBootApplication下的Application类中,它会强调它,因为它是多余的。删除它,瞧瞧所有关于失踪豆子的警告都消失了!傻春......


41
投票

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

我知道它应该没有这个注释。但是如果你添加它,IntelliJ将不会显示错误。

@Repository
public interface YourRepository ...
...

如果你使用Spring Data扩展Repository类,那将是冲突问题。然后你必须指出明确的pagkages。

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

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

接下来,您可以无错误地自动装配您的存储库。

@Autowired
YourRepository yourRepository;

它可能不是一个好的解决方案(我猜你试图两次注册repositorium)。但为我工作,不要显示错误。

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


1
投票

在我的案例中,我试图@Autowired的目录不在同一级别,

在相同结构级别设置后,错误消失

希望它可以帮助一些人!


0
投票

我在Spring启动应用程序中解决这个问题的方法是打开spring应用程序上下文并手动为缺少的autowired bean添加类!

(通过Project Structure菜单或弹簧工具窗口访问...编辑“Spring Application Context”)

因此,仅包含我的ExampleApplication spring配置的SpringApplicationContext,它还包含缺少的Bean:

Spring ApplicationContext:

  • example application.Java
  • missing bean class.Java

这里是:错误消息消失了!


0
投票

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

import org.jvnet.hk2.annotations.Service

代替

import org.springframework.stereotype.Service

盲目接受Idea建议进口的第一选择。第一次发生时我花了几分钟:-)


0
投票

令人惊讶的是,成功运行Eclipse的面向Feign的项目无法在InteliJ中运行。当启动应用程序时,InteliJ抱怨我试图向serviceImpl层注入的Feign客户端说:字段personRestClient(我的Feign客户端)在......中需要一个无法找到的类型为bean的bean。考虑在配置中定义类型为'....'的bean。

我浪费了很长时间才弄明白什么是错的。我找到了一个解决方案(针对InteliJ),我并不完全理解:

  1. Alt Shift F10(或运行菜单)
  2. 选择“编辑配置”
  3. 在配置窗口中,选中复选框'包含依赖项“提供”范围“
  4. 运行您的应用程序

或者选择Eclipse :)


0
投票

检查bean的包是否正确写入

//Check if this is written right 
package com.package1.package2.package3


import ...

@Service
class ServiceX {

  ...

}

0
投票

将@AutoConfigureMockMvc用于测试类。


0
投票

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


-1
投票

在我的情况下,我将@Autowired更改为@ Resource,错误的提示就消失了


-14
投票

我也遇到了这个问题,并通过删除Spring Facet解决了这个问题:

  • 文件 - >项目结构
  • 选择Facets
  • 删除Spring

祝好运!


21
投票

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

enter image description here


15
投票

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

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

但是,如前所述,@ SpringBootApplication注释替换了@ComponentScan,因此在这种情况下,您必须执行相同的操作:

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

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


14
投票

我总是通过以下方式解决这个问题。设置>检查> Spring Core>代码,而不是从错误转移到警告严重性选项

enter image description here


12
投票

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

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

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

5
投票

@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");
    }
}

4
投票

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

  1. 创建一个名为“服务,处理器和路由器”的组或您喜欢的任何名称;
  2. 删除并重新创建“Spring Application Context”,使用您之前创建的组作为父组。

enter image description here


4
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.