2015-12-07 78 views
0

我有兩個不同的方面類,方面的類1會照顧任何將出現在我的所有控制器文件中的異常,另一個方面類2將處理幾個特定的​​異常只會出現在一個特定的控制器文件中。我已經指定了優先級順序,使aspect2的優先級高於aspect1。 方面類1是如下multiple @Around AspectJ在同一個連接點

@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

方面類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); 
}} 
+0

感謝您的建議。但是這應該通過理想的優先解決,對嗎?無論如何,我通過在同一個方面類中加入點數來修復這個問題,而不是兩個不同的類 – Crane

+0

是的,我認爲優先級是解決問題的「正確」方法。我拋出這個作爲一個解決方法。 – pdmoore

0

能夠通過在同一方面類中添加切入點而不是在不同方面類中解決此問題。