2010-12-09 2 views
0

하나의 예외가 다른 예외의 수퍼 클래스 인 경우, 두 개의 AfterThrows advice가 특정 예외 유형에 의해 제한된 동일한 pointcut에 적용될 수 있습니까? 하위 클래스가 캡처되는 경우 하나의 조언 만 실행됩니까?Spring, Aspect J, 동일한 Pointcut에 여러 AfterThrowing advice 적용

번역 할 내용 런타임 예외 (사용자 지정 및 표준 자바와 같은)는 서비스 계층에서 제거되어 특정 사례에서 특정 번역을 수행 한 다음 번역 할 모든 유형의 조언을 제공합니다. 정말 예상치 못한 아무것도 :

 
@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "rnfex") 
public void doTranslationAction(ResourceNotFoundException rnfex) { 
    // throw new WebApplicationException with Status.NOT_FOUND; 
} 

@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "aex") 
public void doTranslationAction(AuthorisationException aex) { 
    // throw new WebApplicationException with Status.NOT_AUTHORISED; 
} 

@AfterThrowing(pointcut = "execution(* com.my.company.api.*(..))", throwing = "throwable") 
public void doTranslationAction(Throwable throwable) { 
    // Log something here about this unexpected exception 
    // throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR 
} 

내가 명시 적으로 올바른 방법이라고 음식을 장만 예외가 발생하는 경우이 경우, 번역 예외가 넓은 '의 Throwable에 의해 다음 포착되는, 슬로우되는 것을 발견 '조언을 듣고 다시 캐치 올 INTERNAL_SERVER_ERROR WAE로 번역되었습니다. 이것은 예기치 않은 것이 아니라 내가 찾고있는 것만은 아닙니다.

이 문제를 해결하기 위해 모든 Throwable 유형을 캡처 한 다음 'instanceof'를 사용하여 이것이 특정 WAE로 변환 할 수있는 예상되는 런타임 예외인지 여부를 결정하는 조언을 얻었습니다.

내가 'instanceof'를 본다면 부끄러워 할 일이있을 것이라고 확신하지만이 문제없이이 문제를 해결하는 더 좋은 방법이 있는지 확실하지 않습니다.

예상 된 예외를 확인 된 예외로 변환 한 다음 런타임 예외를 잡아서 하나의 솔루션으로 간주 할 수도 있습니다.

답변

0

나는 얼마 전에 비슷한 양상을 썼다. 그리고 나는 "instance of"를 사용하는 것으로 끝났다. 나는 거기에 문제가 있다고 생각하지 않는다.

0

난 오전 확신하지 ...하지만 당신의 마지막 (제 3 호)의 조언이 XyzAspect.java 당신이 쓰고있는 @Aspect 클래스는

execution(* com.my.company.api..*(..)) and !execution(* com.my.company.api.XyzAspect..*(..)) 
public void doTranslationAction(Throwable throwable) { 
    // Log something here about this unexpected exception 
    // throw new WebApplicationException with Status.INTERNAL_SERVER_ERROR 
} 

아래의 방식으로 기입 할 수 있을지 어떨지 궁금 이 3 가지 충고.