2017-12-31 21 views
0

우리는 CRUD 작업을 수행 할 많은 엔티티가있는 프로젝트를 수행하고 있습니다. 나는 기본 엔티티 클래스를 만들고 다른 모든 엔티티에서 created_date, created_by, last_updated_date, last_updated_by 등의 공통 필드를 갖는 기본 엔티티 클래스를 확장했습니다. 이제 Spring CrudRepository 메소드에 aspect를 구현하고 위를 설정합니다. 절약하면서 언급 된 필드.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

그것은이다 실제로 aspect만을 볼 수 있기 때문에, 당신이 무엇을 잘못했는지 알기는 어렵지만, 실제 코드 (패키지 이름, 클래스 및 메소드 선언)는 대상이 아닙니다. 또 다른 질문은 Spring AOP가 올바르게 설정되었는지, 즉 AOP가 올바르게 작동하는지 여부입니다. 실행 (* * (..))과 단순한'@ Before' advice 나 결과를 리턴하는 간단한'@ Around' advice와 같은 단순한 pointcut을 위해, 다른 것은 없습니까? – 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); 
    } 
} 
관련 문제