AOP 클래스를 활용하면서 joinpoint.getArgs()[0] 가 Map<String, String> 을 가져와야 하는데 null을 갖고 오는 상황이 벌어졌다.
왜 그런걸까? 이유는 @After 어드바이스에 있었다.
@After 어드바이스는 PointCut메소드 실행후에 실행되기 때문에 메소드의 인수를 가져올 수 없는 상황이 나타나기도 한다.
이럴 때 사용하는 어노테이션이 바로 @AfterReturning 이다.
다음은 사용 예시이다.
원래는 이렇게 써져 있었는데
@SuppressWarnings("unchecked")
@After
public void pointPlus(JoinPoint joinpoint) {
Map<String, String> paraMap = (Map<String, String>) joinpoint.getArgs()[0];
service.pointPlus(paraMap);
}
여기서 @After 어노테이션을 빼고
@AfterReturning(pointcut = "execution(public com.spring..Controller.pointPlus_*(..) )", returning = "paraMap")
추가한다.
"execution(public com.spring..Controller.pointPlus_*(..) )" 이 부분은 메소드의 포인트컷을 정의한 부분이고
returning = "paraMap" 이 부분은 필요한 파라미터의 명칭을 의미한다.
public void pointPlus(JoinPoint joinpoint, Map<String, String> paraMap) 함수 선언 부분에 파라미터를 추가해주면 끝난다.