覆盖 JpaRepository 方法或调用它的非覆盖方法

Posted

技术标签:

【中文标题】覆盖 JpaRepository 方法或调用它的非覆盖方法【英文标题】:Override JpaRepository method or calling it's non overritten method 【发布时间】:2022-01-23 20:27:29 【问题描述】:

我有一个 JpaRepository,我试图用默认调用覆盖它的 findById() 方法,因为对 findById() 的所有调用都应该接收一个额外的参数。

我可以创建一个带有额外参数的方法并替换现有的调用,但如果可能的话,我想避免未来的开发人员在没有这个额外参数的情况下错误地调用原始方法。他们不需要直接提供它,因此有了覆盖的想法。

我的方法是在存储库中使用额外参数创建一个新方法,并使用包装的默认方法调用覆盖 findById() 方法。

// Creating the method with the extra parameter
Optional<Season> findByIdAndUnitId(Long id, Long unitId);

// Overriding and wrapping all the calls to the new default method
@Override
default Optional<Season> findById(Long id) 
   return findByIdAndUnitId(id, RequestContext.getCurrentUserValidating().getUnit());

我需要传递的额外参数是从 RequestContext 中提取的 Long,但获取此参数可能会引发异常,因此我需要捕获它(我也不允许删除此异常)。

@Override
default Optional<Season> findById(Long id) 
    try 
        return findByIdAndUnitId(id, RequestContext.getCurrentUserValidating().getUnit());
     catch (DefaultException e) 
        e.printStackTrace();
    

我接下来要做的是:如果引发异常,我想调用我要覆盖的原始方法,如下所示:

@Override
default Optional<Season> findById(Long id) 
    try 
        return findByIdAndUnitId(id, RequestContext.getCurrentUserValidating().getUnit());
     catch (DefaultException e) 
        return super.findById(id)
    

这种方法产生了一些问题。第一个是从 JpaRepository 调用 super 不会让我访问 findById 方法,因为它是在其扩展接口之一(CrudRepository)中声明的,导致此错误:Unqualified super reference is not allowed in extension method

我也没有运气尝试以下方法:

return JpaRepository.super.findById(id); // Abstract method 'findById(ID)' cannot be accessed directly


return this.findById(id);   // Will call the same method, resulting in a possible infinite loop


return super.findById(id); // Unqualified super reference is not allowed in extension method

如何在被覆盖的方法中调用原始方法?

编辑:

尝试@talex 建议:

return CrudRepository.super.findById(id); // Will produce 'org.springframework.data.repository.CrudRepository' is not an enclosing class

【问题讨论】:

【参考方案1】:

合格的super 电话看起来像:

return CrudRepository.super.findById(id);

【讨论】:

感谢您的回答。尝试这种方法会产生“org.springframework.data.repository.CrudRepository'不是封闭类”

以上是关于覆盖 JpaRepository 方法或调用它的非覆盖方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring 为在 @Transactional 注释方法中调用的每个 JpaRepository 方法打开一个新事务

Spring Boot JpaRepository 保存调用似乎没有做任何事情

SpringDataJpa——JpaRepository查询功能(转)

70 JpaRepository 查询方法没有实现却可以正常使用

70 JpaRepository 查询方法没有实现却可以正常使用

Spring JPA no @Transnational 保存 JpaRepository