为了账号安全,请及时绑定邮箱和手机立即绑定

直接注入 JpaRepository<User>

直接注入 JpaRepository<User>

宝慕林4294392 2023-06-21 15:01:49
我正在寻找一种方法拦截所有发送到所有已定义方法的请求。(定义= JpaRepository 接口上的任何内容)。因此,例如,当有人调用 repo.findAll() 时,我将能够在之前和之后运行通用代码。(通用=所有实体的相同代码)。所以我所做的就是在 JpaRepository 中创建一个泛型类并实现方法,然后拦截所有请求。@Repositorypublic class BaseJpaRepository<T> implements JpaRepository<T, Long> {    @Autowired    private JpaRepository<T, Long> repository;    @Override    public List<T> findAll() {        //run some code here        List<T> res = repository.findAll();        //run some code here        return res;    }    // all other methods here...}这是注入服务的接口:@Repositorypublic interface UserRepository extends JpaRepository<UserEntity, Long> {}这是豆子@Repositorypublic class UserRepositoryBean extends  BaseJpaRepository<User> implements JpaRepository<User, Long> {}问题是private JpaRepository<T, Long> repository;没有注入,我认为这是因为 spring 在引导时需要实体类型。我还尝试将显式类型注入到构造函数 ifUserRepositoryBean并将其传递给父级。但它并不满意。@Repositorypublic class UserRepositoryBean extends  BaseJpaRepository<User> implements JpaRepository<User, Long> {public UserRepositoryBean(JpaRepositry<User, Long> repo){super(repo);}}有什么方法可以拦截所有的 Spring jpa 方法吗?
查看完整描述

1 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

首先,您定义所有自定义存储库将从中继承的基本接口


@NoRepositoryBean

interface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> {

     // You can also declare any generic methods here, 

     // and override (intercept) them in BaseJpaRepositoryImpl as well

}

它的实施也是如此


@NoRepositoryBean

class BaseJpaRepositoryImpl<T, ID>

        extends SimpleJpaRepository<T, ID>

        implements BaseJpaRepository<T, ID> {


    public BaseJpaRepositoryImpl(JpaEntityInformation<T, ID> entityInformation, EntityManager em) {

        super(entityInformation, em);

    }


    // One of 'defined' methods inherited from SimpleJpaRepository (and in turn from JpaRepository)

    @Override

    public List<T> findAll() {

        //run some code here

        List<T> res = super.findAll();

        //run some code here

        return res;

    }


    // other 'defined' methods to intercept ...

}

然后,您的自定义存储库将看起来像往常一样,只是它现在是从您的BaseJpaRepository接口而不是 Spring 的接口派生的JpaRepository


@Repository

interface UserRepository extends BaseJpaRepository<User, Long> {

}

为了使其一切正常,让我们修改以下注释,该注释通常放置在某个@Configuration类或@SpringBootApplication-ed 类上


@EnableJpaRepositories(

        basePackages = {"org.example.repositories"},

        repositoryBaseClass = BaseJpaRepositoryImpl.class

)



查看完整回答
反对 回复 2023-06-21
  • 1 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信