【问题标题】:How to access main repository from cusom repository in Spring Data JPA?如何从 Spring Data JPA 中的自定义存储库访问主存储库?
【发布时间】:2017-04-23 16:48:31
【问题描述】:

我正在为variables 表编写存储库,并希望使用它访问特定的行。为此,我正在尝试将主存储库自动装配到自定义实现中,如下所示:

public interface VariableRepo extends CrudRepository<Variable, Long>, VariableRepoCustom {
   Variable getByName(String name);
}

public interface VariableRepoCustom {
...
   Variable getPopulationSingle();
...
}

public class VariableRepoCustomImpl implements VariableRepoCustom {

   private final VariableRepo variableRepo;

   @Autowired
   public VariableRepoCustomImpl(VariableRepo variableRepo) {
      this.variableRepo = variableRepo;
   }

   @Override
   public Variable getPopulationSingle() {
      return getByName("Population single");
   }
...
}

不幸的是,Spring 喜欢为此发疯,抛出异常:

创建名为“variableRepo”的 bean 时出错:调用 init 方法失败;嵌套异常是 org.springframework.data.mapping.PropertyReferenceException:否 找到类型变量的属性 getPopulationSingle!

即它试图在实体类 (Variable) 中查找存储库方法,当然不应该包含在其中。

如何解决?

【问题讨论】:

  • 您需要将自定义 repo 命名为 impl VariableRepoImpl

标签: java spring spring-data-jpa


【解决方案1】:

你命名的 VariableRepoCustom/VariableRepoCustomImpl 实际上应该是一个服务(不是 spring-data-jpa 的存储库)。

接口 VariableRepoCustom 不应出现在 JPA 搜索路径中,以防止 JPA 生成实现

【讨论】:

  • 将自定义...移动到另一个包没有帮助。
  • 你的 JPA 搜索路径是什么?如果接口从 JPA 搜索路径中移出,JPA 将无法尝试生成实现
  • 你的应用上下文中应该有这样的行:
  • 我有。存储库工作。唯一不起作用的是回购扩展中的回购
【解决方案2】:

我认为可能是您的存储库 impl 没有 @Repository 注释。请将存储库和 impl 都设为 @Repository。它应该可以解决您的问题。

为获得最佳实践,无需将VariableRepo 接口自动连接到 impl 类中。

编辑: 还要从 impl 中删除自定义。该名称将通过附加 impl 命名为 RepoName。它的定义类似于 VariableRepoImpl

【讨论】:

猜你喜欢
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 2017-09-19
  • 2021-04-01
  • 1970-01-01
  • 2018-01-09
相关资源
最近更新 更多