【发布时间】: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 切入点时,优先顺序似乎不起作用。我在这里遗漏了什么吗?
【问题讨论】: