定義されたすべてのメソッドへのすべてのリクエストをインターセプトする方法を探しています。
(定義済み= 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メソッドをインターセプトする方法はありますか?
ありがとう
最初に、すべてのカスタムリポジトリが継承される基本的なインターフェイスを定義します
@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
)
PS別の実行可能なアプローチは、Spring AOPを使用することです。ここで同様の質問をチェックすることもできます
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加