我有兩個不同的方面類,方面的類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切入點時,依從順序似乎不起作用。我在這裏錯過了什麼嗎?
感謝您的建議。但是這應該通過理想的優先解決,對嗎?無論如何,我通過在同一個方面類中加入點數來修復這個問題,而不是兩個不同的類 – Crane
是的,我認爲優先級是解決問題的「正確」方法。我拋出這個作爲一個解決方法。 – pdmoore