当前位置: 首页 > 知识库问答 >
问题:

Spring JPA自定义存储库实现不工作

齐胜涝
2023-03-14

我使用的是Spring数据JPA1.10.11。释放

我有一个基础存储库,所有其他存储库都会扩展它。这部分有效。

@NoRepositoryBean
public interface BaseRepository<T, ID> extends JpaRepository<T, Long> {
    T findById(ID id);
    List<T> getByIds(Collection<ID> ids);
    Map<ID, T> getMapByIds(Collection<ID> ids);
}

public class BaseRepositoryImpl<T, ID> extends
    SimpleJpaRepository<T, Long> implements BaseRepository<T, ID> {
    
    // implementations
}

我还想为一些要扩展的存储库声明一个自定义接口。所以我声明了一个接口和一个“Impl”类:

public interface TestRepository<T> {
    int myTestMethod(OffsetDateTime threshold);
}

@Repository
public class TestRepositoryImpl<T> implements TestRepository<T> {

    @Override
    public int myTestMethod(OffsetDateTime threshold) {
        System.out.println("myTestMethod");
        return 100;
    }
}

然后,我创建一个现有的工作存储库来扩展这个新接口:

@Repository
public interface MyEntityDataRepository extends
    BaseRepository<MyEntity, MyEntityId>,
    TestRepository<MyEntity> {

    MyEntity findBySomeCriteria(....);
}

注意:此存储库在扩展TestRepository之前工作,但是在如上扩展之后,应用程序上下文将无法以错误开始:

Caused by: org.springframework.data.mapping.PropertyReferenceException: No property myTestMethod found for type MyEntity!
    at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:77)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:329)
    at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:309)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:272)
    at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:243)
    at org.springframework.data.repository.query.parser.Part.<init>(Part.java:76)
......

配置如下所示:

<jpa:repositories
  base-package="com.xxx.repository"
  base-class="com.xxx.repository.BaseRepositoryImpl"
  transaction-manager-ref="transactionManager"
  entity-manager-factory-ref="entityManagerFactory"
/>

我觉得我一直在遵循Spring数据文档中的示例。我还尝试过使用接口和impl名称,并添加了

repository-impl-postfix="Impl"

到配置。一切都是徒劳的。我每次都犯同样的错误。

有人看到这个问题并解决了吗?非常感谢你的帮助。

共有1个答案

邓崇凛
2023-03-14

我将在调查后回答我自己的问题。

在Spring的文档中,(至少对我来说)不明显的是,CustomRepository/Impl机制只能用于单个存储库。如果您想创建一些由多个存储库继承的自定义实现,那么必须自定义基本存储库,它将用于支持所有存储库bean。

因此,我最终在基本存储库implBaseRepositoryImpl中添加了一个int-myTestMethod(OffsetDateTime阈值)实现。此方法将用于支持MyEntityDataRepository中声明的方法,该方法扩展了TestRepository。注意:必须允许存储库扩展声明自定义方法的接口。否则,基本存储库impl中的函数将不可用于存储库bean,它只是接口的代理,而不是基本存储库impl。

此外,如果在实体存储库中自定义相同的方法,您实际上可以重写基本存储库的实现。

这并不理想,但很管用。我希望我可以将自定义方法的可用性限制在某些存储库中。这样做的一种方法是将存储库的不同“组”分成单独的不相交的包,并为每个单独的搜索路径声明一个不同的基类。但在许多情况下,这可能没有意义。

 类似资料:
  • 这类似于在无法使用两个带有Spring Boot/Spring数据Neo4j的Neo4j实例中讨论的内容,但我没有两个数据库。我从git repo下载了spring data neo4j示例java应用程序,希望执行动态查询,而不是通过存储库接口执行静态查询。 我面临一个空事务管理器的问题。 这是我的界面: 以下是我的自定义回购建议: 以下是我的配置: 因为我只有一个TransactionMana

  • 在我的项目中有几个实体具有相同的属性(对于示例'name'),所以,有可能创建一个存储库,其中使用自定义的select(实体)?因此,我从JpaRepository扩展了我的存储库,我扩展了MyCustomJpaRepository,MyCustomJpaRepository也扩展了JpaRepository,使其能够从JpaRepository授予基本功能? TKS

  • 项目配置为使用多个MongoTemplate Mongo Ref传递为 问题:我需要访问MongoTemplate,它是类似的标准存储库。 例如,如果正在将接口扩展为 MyRepoCustomImpl 问题:相反,难道没有任何方法可以让要使用的MongoTemplate根据它扩展到的Repo自动注入或解析吗?

  • 假设我想有一个方法,它是获得超级主要客户,它有。 其中声明了方法。 然后我的公开存储库界面变成以下内容: 它扩展了和my。 我写的 bot不知道,在实现中写什么。如何接触客户?

  • 我发现对于减少样板非常有用,但它似乎给工作带来了麻烦。我现在试图用自定义的基类存储库扩展,而在启动时,Spring在正确实例化存储库方面遇到了问题。 我已经尝试了几个关于这个主题的变体,但是没有运气让事情成功地连线起来。我在Spring的问题跟踪器https://jira.spring.io/browse/datajpa-674上遇到了一个类似的问题,但没有关于修复的解释,只是对代码进行了重构,使

  • 我最终不得不在文件。定义通常非常繁琐: 注意上面gradle提供了一种定义常用maven存储库的好方法(即)。我想在插件或父gradle脚本中找到一种方法,在函数中或静态地定义存储库,然后在块中调用它:。 我缺乏groovy方面的知识,因此我不太了解解析groovy源代码所需的知识,我正在寻找一种很好的方法来实现这一点。我该怎么做? 我知道在父级gradle文件中,我可以使用或。我不想将这些mav