[英]multiple @Around AspectJ on the same joinpoint
我有兩個不同的方面類,方面類1負責處理所有我的控制器文件中發生的任何異常,而另一個方面方面2則負責處理僅在一個特定控制器文件中發生的少數特定異常。 我指定了優先順序,使長寬比類2的長於高寬比1。 方面類1如下
@Aspect
@Order(1)
public class TrackOperations {
@Around("apiPointcut()")
public Object handleException(ProceedingJoinPoint pjp) throws Throwable {
try {
return pjp.proceed();
} catch (Exception e) {
LOGGER.error("Caught exception: ", e);
StringBuilder sb = getExceptionTrace(e);
StringWriter errorStackTrace = new StringWriter();
e.printStackTrace(new PrintWriter(errorStackTrace, true));
response.addError(error);
return new ResponseEntity<String>(JsonUtil.toJson(response), HttpStatus.INTERNAL_SERVER_ERROR);
}}
方面類2
@Aspect
@Order(0)
public class TrackServiceOperations {
@Around("apiPointcut()")
public Object handleServerException(
try {
return pjp.proceed();
} catch (HttpClientErrorException | HttpServerErrorException e) {
response = (Response<String>) ContextUtil.get(key);
response.addError(new Error("Assessment Service Status Code: " + e.getStatusCode(), ErrorConstants.REQUEST_FAILED));
LOGGER.error("Recieved" + e.getStatusCode() + " status from Assessment Service");
return new ResponseEntity<String>(JsonUtil.toJson(response), HttpStatus.OK);
}
}}
在應用程序xml中提到了相同的內容
<bean id="TrackServiceOperations" class="in.foo.foo.TrackServiceOperations" factory-method="aspectOf" />
<bean id="TrackOperations" class="in.foo.foo.TrackOperations" factory-method="aspectOf" />
但是,當控制器文件引發所需的異常時,方面類1最終將處理異常,而不是方面類2。當我禁用方面類1時,事情按預期進行,但是當我同時使用@around切入點時,優先順序似乎不起作用。 我在這里想念什么嗎?
方面類1正在處理HttpClientErrorException和HttpServerErrorException都派生的通用Exception。 因此,當您希望在方面類2中處理異常時,它們已經被方面類1的處理程序覆蓋。
要解決此問題,您可以在方面類1處理程序中檢查異常的類型,然后將要在方面類2中處理的那些特殊異常扔掉。(這感覺像是一團糟,因為現在它已使方面1知道方面2的內容)。
public Object handleException(ProceedingJoinPoint pjp) throws Throwable {
try {
return pjp.proceed();
} catch (Exception e) {
(if e instance of org.springframework.web.client.HttpStatusCodeException || e instanceof org.springframework.web.client. HttpServerErrorException) throw e;
LOGGER.error("Caught exception: ", e);
StringBuilder sb = getExceptionTrace(e);
StringWriter errorStackTrace = new StringWriter();
e.printStackTrace(new PrintWriter(errorStackTrace, true));
response.addError(error);
return new ResponseEntity<String>(JsonUtil.toJson(response), HttpStatus.INTERNAL_SERVER_ERROR);
}}
通過在同一方面類而不是不同方面類中添加切入點,可以解決此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.