2017-12-31 47 views
0

私はCRUD操作を行うエンティティがたくさんあるプロジェクトをやっています。私はベースエンティティクラスを作成し、他のすべてのエンティティでは、created_date、created_by、last_updated_date、last_updated_byなどの共通フィールドを持つ基本エンティティクラスを拡張しました。今、Spring CrudRepositoryメソッドのアスペクトを実装したいと思います節約しながら上記のフィールド。Aspect on Spring crudリポジトリメソッドを実装する方法

私はこのようなものを実装しようとしましたが、動作しませんでした。私たちが最初にこのポイントカットを処理するメソッドを作成し、その後、(メソッドを「保存」のご使用の場合)、フィルタの式にポイントカット方法を定義する必要があり様相で動作するように

package com.cerium.aop; 

import java.util.Date; 

import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Component; 

import com.cerium.datamodel.AccountDataModel; 
import com.cerium.domain.Account; 
import com.cerium.domain.BaseEntity; 
import com.cerium.util.Constants; 

/** 
* @author Manikanta B Cerium 
* 
*/ 
@Component 
@Aspect 
public class SampleAspect { 

    private static final Logger LOG = LoggerFactory.getLogger(SampleAspect.class); 

    @Around("execution(* com.cerium.repository.*.save (com.cerium.domain.BaseEntity)) && args(saveData)") 
    public Object beforeSave(ProceedingJoinPoint proceedingJoinPoint, Object saveData) throws Throwable { 

     LOG.debug("Into aspect before save: {}", saveData); 

     BaseEntity baseEntity = (BaseEntity) proceedingJoinPoint.proceed(new Object[] { saveData }); 

     // set the fields here...... 
     baseEntity.setCreatedDate(new Date()); 

     System.out.println(saveData); 

     return baseEntity; 

    } 
} 
+0

ことがありますアスペクトだけが表示されるため、実際のコード(パッケージ名、クラス、およびメソッドの宣言)は対象ではないため、何が問題になっているのか分かりません。別の問題は、Spring AOPが正しく設定されているかどうかです。 '実行(* *(..))'やシンプルな '@ Before'アドバイス、あるいは単に結果を返すだけの単純な' @ Around'アドバイスのような単純なポイントカットでは何もありません。 – kriegaex

+0

それがあなたを助けたら答えを受け入れることを忘れないでください... – Cepr0

答えて

1

@Component 
@Aspect 
public class CommonSaveAspect { 

    @Pointcut("execution(* com.cerium.repository.*.save(*))") 
    public void commonSave() { 
    } 

    @Around("commonSave()") 
    public Object addCommonData(final ProceedingJoinPoint pjp) throws Throwable { 

     Object[] args = pjp.getArgs(); 

     if (Iterable.class.isAssignableFrom(args[0].getClass())) { 
      //noinspection unchecked 
      Iterable<BaseEntity> entities = (Iterable<BaseEntity>) args[0]; 
      entities.forEach(entity -> { 
       // set the fields here... 
      }); 
     } 

     if (args[0] instanceof BaseEntity) { 
      BaseEntity entity = (BaseEntity) args[0]; 
      // set the fields here... 
     } 

     return pjp.proceed(args); 
    } 
} 
関連する問題