gpt4 book ai didi

java - 同一连接点上有多个 @Around AspectJ

转载 作者:行者123 更新时间:2023-12-01 10:46:21 24 4
gpt4 key购买 nike

我有两个不同的方面类,方面类 1 将处理所有 Controller 文件中发生的任何异常,而另一个方面类 2 将处理仅在一个特定 Controller 文件中发生的少数特定异常。我已经指定了优先顺序,使方面类 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" />

但是当 Controller 文件抛出所需的异常时,方面类 1 最终会处理异常,而不是方面类 2。当我禁用方面类 1 时,事情会按预期正常工作,但是当我同时使用 @around 切入点时,优先顺序似乎不起作用。我在这里遗漏了什么吗?

最佳答案

方面类 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);
}}

关于java - 同一连接点上有多个 @Around AspectJ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34144145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com