【问题标题】:Spring Boot JPA CrudRepositorySpring Boot JPA CrudRepository
【发布时间】:2017-07-04 09:30:09
【问题描述】:

我正在使用 Spring Boot + Spring Data JPA 并在尝试注入扩展 CrudRepository 的类时遇到此问题:

引起:org.springframework.beans.factory.BeanCreationException: 创建名为“topicRepository”的 bean 时出错:无法解析 匹配的构造函数(提示:指定索引/类型/名称参数 避免类型歧义的简单参数)

存储库类:

public interface TopicRepository extends CrudRepository<Topic, Integer> {}

服务类:

@Service
public class TopicService {

      @Autowired
      private TopicRepository topicRepository;
}

有什么建议吗?

【问题讨论】:

  • 你的界面上有@Repository注解吗?如果是,请将其删除。
  • 不,我在接口上没有@Repository 注释,这些类看起来与这篇文章中的完全一样。谢谢。
  • 通常这应该足够了。您在主题服务或任何其他 xml 配置上是否有非默认构造函数?
  • 我根本没有xml配置,TopicService只有默认的构造函数。谢谢。
  • 您能提供给我们您的 jpa 配置吗?前提是您有自定义 jpa 配置。谢谢

标签: spring spring-boot spring-data spring-data-jpa


【解决方案1】:

我遇到了同样的问题,我通过切换 Spring Boot 版本解决了这个问题。更改 Spring Data JPA 版本没有任何效果(这是我假设的错误所在),所以我认为 Spring Boot 版本 1.5.1 中存在错误。我切换回 1.4.3 版本,错误消失了。我没有尝试后续/不同的版本,因此您可能只需要试验您的依赖项及其版本。

作为记录,您可以使用@Repository 注释您的服务类,它不应该有任何区别。我一直在使用 service/dao 模式以相同的方式设置这些应用程序,并且它对注释从来都不是太挑剔。希望这可以帮助其他 Spring Boot 开发流程突然抛出错误的人!

【讨论】:

    【解决方案2】:

    您使用的是哪个版本的 spring-data-commons 和 spring-data-jpa。我刚刚使用 spring-data-commons 1.13.x 和 spring-data-jpa 1.10.x 遇到了这个问题。将 spring-data-jpa 升级到 1.11.x 为我解决了这个问题。

    【讨论】:

    • 感谢您使用版本组合解决了这个问题。它有帮助。
    • 非常感谢...花了 3 个小时来解决这个问题!你摇滚!
    【解决方案3】:

    在将 Spring Boot 更新到 1.5.4 后,我也遇到了同样的问题。

    我也在使用 spring-data-envers,它的版本是 1.0.4。升级到 1.4.1 解决了这个问题。

    我希望它可以帮助某人:)

    【讨论】:

      【解决方案4】:

      确保:

      1) TopicRepository 用@Repository注解。

      2) 您已配置扫描包:

      <jpa:repositories base-package="mypkg.repositories"></jpa:repositories>
      

      【讨论】:

      • 两者都不是必须的。
      • Spring 数据扫描扩展 CrudRepository、JPARepository 等的存储库。不需要 Spring 数据的 @Repository 注释。
      • 根据 Sprign 规范 docs.spring.io/spring-data/jpa/docs/current/reference/html,您应该使用 JavaConfig - @EnableJpaRepositories 或我指定的 xml 添加该配置
      【解决方案5】:

      在 1.5.2 上遇到了同样的问题。升级到 1.5.5 解决了这个问题。

      【讨论】:

        【解决方案6】:

        您可以使用 Applicationcontext 将存储库注入到此参考主题Repository.. 您只需在 @rest 控制器类中声明 applicationcontext 通过使用注释与 topicRepository 相同。然后你将它传递给应该通过构造函数获取参数的服务类。 前任- public TopicService(Applicationcontext ctx) {this.topicRepository =context.getBean(TopicRepository.class); }

        【讨论】:

          猜你喜欢
          • 2018-05-12
          • 2014-07-01
          • 1970-01-01
          • 2020-09-29
          • 1970-01-01
          • 1970-01-01
          • 2016-07-01
          • 1970-01-01
          • 2023-03-12
          相关资源
          最近更新 更多