猿问

直接注入 JpaRepository<User>

我正在寻找一种方法拦截所有发送到所有已定义方法的请求。

(定义= JpaRepository 接口上的任何内容)。

因此,例如,当有人调用 repo.findAll() 时,我将能够在之前和之后运行通用代码。

(通用=所有实体的相同代码)。

所以我所做的就是在 JpaRepository 中创建一个泛型类并实现方法,然后拦截所有请求。

@Repository

public 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...

}

这是注入服务的接口:


@Repository

public interface UserRepository extends JpaRepository<UserEntity, Long> {


}

这是豆子


@Repository

public class UserRepositoryBean extends  BaseJpaRepository<User> implements JpaRepository<User, Long> {


}

问题是private JpaRepository<T, Long> repository;没有注入,我认为这是因为 spring 在引导时需要实体类型。


我还尝试将显式类型注入到构造函数 ifUserRepositoryBean并将其传递给父级。但它并不满意。


@Repository

public class UserRepositoryBean extends  BaseJpaRepository<User> implements JpaRepository<User, Long> {


public UserRepositoryBean(JpaRepositry<User, Long> repo){super(repo);}


}

有什么方法可以拦截所有的 Spring jpa 方法吗?


宝慕林4294392
浏览 156回答 1
1回答

婷婷同学_

首先,您定义所有自定义存储库将从中继承的基本接口@NoRepositoryBeaninterface BaseJpaRepository<T, ID> extends JpaRepository<T, ID> {     // You can also declare any generic methods here,      // and override (intercept) them in BaseJpaRepositoryImpl as well}它的实施也是如此@NoRepositoryBeanclass 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@Repositoryinterface UserRepository extends BaseJpaRepository<User, Long> {}为了使其一切正常,让我们修改以下注释,该注释通常放置在某个@Configuration类或@SpringBootApplication-ed 类上@EnableJpaRepositories(        basePackages = {"org.example.repositories"},        repositoryBaseClass = BaseJpaRepositoryImpl.class)
随时随地看视频慕课网APP

相关分类

Java
我要回答