我正在寻找一种方法来拦截去往所有定义方法的所有请求。
(定义为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需要在启动时使用Entity类型。
如果UserRepositoryBean
,我也尝试将其显式类型注入构造函数并将其传递给父级。但不满意。
@Repository
public class UserRepositoryBean extends BaseJpaRepository<User> implements JpaRepository<User, Long> {
public UserRepositoryBean(JpaRepositry<User, Long> repo){super(repo);}
}
有什么方法可以拦截所有Spring jpa方法?
谢谢
答案 0 :(得分:1)
首先,您将定义所有自定义存储库都将继承的基本接口
@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
版的类上的以下注释
@EnableJpaRepositories(
basePackages = {"org.example.repositories"},
repositoryBaseClass = BaseJpaRepositoryImpl.class
)
PS 。另一种可行的方法是使用Spring AOP。您也可以查看类似的问题here