【问题标题】:multiple @Around AspectJ on the same joinpoint多个 @Around AspectJ 在同一个连接点上
【发布时间】:2015-12-07 22:03:19
【问题描述】:

我有两个不同的方面类,方面类 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 切入点时,优先顺序似乎不起作用。我在这里遗漏了什么吗?

【问题讨论】:

    标签: java spring aop aspect


    【解决方案1】:

    方面类 1 正在处理 HttpClientErrorException 和 HttpServerErrorException 派生自的通用异常。因此,当您希望在方面类 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);
    }} 
    

    【讨论】:

    • 感谢您的建议。但这应该在理想情况下优先解决,对吧?无论如何,我通过在同一个方面类而不是两个不同的类中添加切点来解决这个问题
    • 是的,我认为优先级是解决它的“正确”方法。我把它扔在那里作为一种解决方法。
    【解决方案2】:

    能够通过在同一方面类而不是不同方面类中添加切入点来解决此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-02
      • 1970-01-01
      • 1970-01-01
      • 2015-05-18
      • 2015-07-24
      相关资源
      最近更新 更多