簡體   English   中英

同一連接點上有多個@Around AspectJ

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM