亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

直接注入 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 關注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號