无法自动装配。找不到`Repository'类型的bean。

4
我正在使用Spring Data Jpa,这是我的项目结构:

App
  ConfigPackage
    MyConfig
  ServicePackage
    MyService
  RepositoryPackage
    MyRepository

这里是MyRepository
public interface MyRepository extends JpaRepository<MyEntity, Long> {
}

这里是MyService

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository; <---here

    ...
}

这里是MyConfig配置文件:
@Configuration
@EnableJpaRepositories(
        basePackages = "RepositoryPackage",
        entityManagerFactoryRef = "xxx",
        transactionManagerRef = "xxx"
)
public class MyConfig {
}

我使用@AutowiredMyRepository注入到MyService中,但是IntelliJ总是会抱怨:

无法自动连接。找不到'MyRepository'类型的bean

即使代码可以成功编译和运行。

为什么IntelliJ不能认识这不是一个错误?如何消除IntelliJ的警告?

IntelliJ版本:2018.2.6


我看到你正确地使用了 '@Service' 注释,但是你是否在存储库类中使用了 '@Repository' 注释?如果没有该注释,在尝试 '@Autowire' 时会出现错误。这也可能很有帮助,因为我没有看到你的主要 SpringBootApplication 类位于哪里:https://dev59.com/veo6XIcBkEYKwwoYGwQZ - Brandon
此问题已被 https://dev59.com/ol8d5IYBdhLWcg3wYhWX#42025703 解决。 - xingbin
6个回答

7
请注意,以下翻译适用于IntelliJ IDEA 2018.3.3 Ultimate Edition(但其他版本也应该适用)。我注意到在使用@ComponentScan的配置中加载了另一个带有@Configuration注释的类(至少在我的项目中会出现此类错误)。IntelliJ似乎没有完全识别它,这导致出现错误/警告。
步骤如下: 1. 在文件结构中点击顶层文件夹 2. 按F4键 3. 进入“Modules” 4. 从列表中选择IntelliJ投诉的模块 5. 点击“Spring” 6. 点击加号图标 7. 选择提供您的xRepository的配置 8. 保存

谢谢,我会尝试的。我不明白为什么IntelliJ把它误认为是一个错误。 - xingbin
@竹杖芒鞋轻胜马 [alt] + [enter] 菜单提供了任何解决方案吗?您还可以通过转到 设置 > 编辑器 > 检查 并将其关闭来忽略这些警告。 - Lino
是的,它让我添加了@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection"),然后警告消失了。我不知道为什么... - xingbin
添加 @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") 解决了问题。但是当我谷歌搜索 SpringJavaInjectionPointsAutowiringInspection 时,我没有找到任何文档或官方文件... - xingbin
我之前采用的解决方案是使用@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection"),这是在我按下 [alt] + [enter] 后由 IntelliJ 建议的。它确实有效,但我不想导入此注释。我将启用 spring data 插件,就像另一个答案所说的那样。 - xingbin
显示剩余5条评论

2

可能是Intellij在@EnableJpaRepositories注解中无法识别你的包名所致。你可以尝试将该注解放置在主Spring类中,并且不定义任何basePackages属性。

"Original Answer"翻译成:"最初的回答"

@EnableJpaRepositories(entityManagerFactoryRef = "xxx", transactionManagerRef = "xxx")
@SpringBootApplication
public class FooApplication {

    public static void main(String[] args) {
        SpringApplication.run(FooApplication.class, args);
    }
}

你的主要Spring类应该放在根目录下。

root
  ServicePackage
    MyService
  RepositoryPackage
    MyRepository
  FooApplication <---- main class here

1
谢谢您的回复。使用@Repository可以消除警告,但是JpaRepositoryNoRepositoryBean。我认为它不应该用@Repository进行注释。我的主类是App,所以我认为该存储库类应该被扫描。 - xingbin
似乎没有帮助。 - xingbin
@竹杖芒鞋轻胜马 你觉得在你的项目中加入 facet 怎么样?从 Project Structure 菜单中,进入你的项目/模块并添加 JPA facet。示例 - buræquete
谢谢您先生,我已经做了那个。但是IntelliJ似乎无法识别它。 - xingbin
再次感谢。我明天会尝试。 - xingbin
显示剩余7条评论

1

Try it :

@Configuration
@ComponentScan(basePackages = {"your repository package}")

我已经在 MyConfig 中做了那个。 - xingbin

0

我曾经遇到过同样的问题,但只要更改项目结构并将MyRepository移动到您拥有服务的相同包中,就可以解决此问题。这应该有效。我不知道为什么会出现这种情况。


0

您可以声明:

@SuppressWarnings("SpringJavaAutowiringInspection")

在字段上,或通过Intellij的代码检查来抑制警告(点击红色灯泡,您可以抑制“Autowiring for Bean Class”对于字段或整个类)。


我应该在哪里放置这个注解? - xingbin
把它放在字段上面。如果你把它放在类的顶部,它也应该能正常工作,但是这样你就会压制所有字段的警告。 - AlgorithmFromHell
我已经尝试了两种方法,但是没有运气,警告仍然存在。 - xingbin
1
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") - Eugene Kortov

0

在数据库配置中,您需要声明基本程序包:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "postgreEntityManager",
        transactionManagerRef = "postgreTransactionManager",
        basePackages = "fr.lab.test.dao"
)
public class PostGreDBConfig {

谢谢回复。我已经这样做了,但还是有警告... - xingbin

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