我们的应用程序使用多个后端服务,并且我们维护包含进行实际服务调用的方法的包装器。如果在调用服务时在任何这些方法中发生任何异常,我们会抛出一个封装原始异常的自定义异常,如下所示。
interface IServiceA {
public void submit(String user, String attributes);
}
public class ServiceAWrapper implements IserviceA {
private ActualService getActualService() {
.....
}
public void submit(String user, String attributes) {
try {
Request request = new Request();
request.setUser(user);
request.setAttributes(attributes);
getActualService().call(request);
} catch(ServiceException1 e) {
throw new MyException(e, reason1);
} catch(ServiceException2 e) {
throw new MyException(e, reason2);
}
}
}
我想知道是否有任何框架可以让我
我正在探索AspectJ以查看它是否可以满足我的要求,但我不确定它是否可以用于捕获在运行时传递给方法的参数,以及捕获异常对象(如果有的话)。
感谢。
答案 0 :(得分:4)
使用AspectJ,您可以use around
advice执行建议而不是连接点处的代码。然后,您可以通过调用proceed来执行建议中的实际连接点。这将允许您捕获输入参数,记录它们,然后继续调用实际方法。
在同一个建议中,您可以捕获从该方法抛出的任何日志,并在将其传回更高级别之前检查或记录它们。
答案 1 :(得分:3)
马特B的回答是正确的。具体来说,你可以这样做:
aspect MonitorServiceCalls { private final Logger LOG = LoggerFactory.getLog("ServiceCallLog"); Object around() throws MyException: call(public * *(..) throws MyException) && target(IServiceA+) { MethodSignature msig = (MethodSignature)thisJoinPoint; String fullMethName = msig.getMethod().toString(); try { Object result = proceed(); LOG.info("Successful call to {} with arguments {}", fullMethName, thisJoinPoint.getArgs()); return result; } catch(MyException e) { LOG.warn("MyException thrown from {}: {}", msig.getMethod(), e); throw e; } } }
答案 2 :(得分:0)
AspectJ是正确的选择。您将能够通过将传递给您的advise方法的JoinPoint对象来获取参数。您也可以通过实施投掷后的建议或周围的建议来获得例外。