Java中的回滚注释
我的应用程序中有服务调用,可以对其他服务以及DB调用进行远程网络调用。Spring Boot很好地支持使用Java中的回滚注释,java,spring,transactions,Java,Spring,Transactions,我的应用程序中有服务调用,可以对其他服务以及DB调用进行远程网络调用。Spring Boot很好地支持使用@Transactional回滚错误事务,但我想知道是否可以使用注释定义自定义回滚过程 我需要回滚其他服务以及数据库上的数据 在代码中,我可以这样做: @Transactional public void doSomethingComplicated() { try { srvcOne.makeRemoteNetworkCall(); srvcTwo.
@Transactional
回滚错误事务,但我想知道是否可以使用注释定义自定义回滚过程
我需要回滚其他服务以及数据库上的数据
在代码中,我可以这样做:
@Transactional
public void doSomethingComplicated() {
try {
srvcOne.makeRemoteNetworkCall();
srvcTwo.makeDatabaseCall();
} catch(Exception e) {
srvcOne.rollBackNetworkCall();
}
}
@Transactional
@MyCustomRollbackListener(handler = MyCustomRollBackHandler.class)
public void doSomethingComplicated() {
srvcOne.makeRemoteNetworkCall();
srvcTwo.makeDatabaseCall();
}
但我希望我能做这样的事情:
@Transactional
public void doSomethingComplicated() {
try {
srvcOne.makeRemoteNetworkCall();
srvcTwo.makeDatabaseCall();
} catch(Exception e) {
srvcOne.rollBackNetworkCall();
}
}
@Transactional
@MyCustomRollbackListener(handler = MyCustomRollBackHandler.class)
public void doSomethingComplicated() {
srvcOne.makeRemoteNetworkCall();
srvcTwo.makeDatabaseCall();
}
在处理程序中:
public class MyCustomRollBackHandler {
public void handleRollback() {
srvcOne.rollBackNetworkCall();
}
}
我实现了一个全局异常监听器,并且我能够获取异常来自的类,但是我无法获取该方法并检索该方法上的任何注释。以下是我的初步尝试:
@ControllerAdvice
public class RollbackExceptionListener{
private static final Logger logger = LoggerFactory.getLogger(RollbackExceptionListener.class);
@ExceptionHandler(Exception.class)
public void lookForAnnotationClassForException(final Exception exception) {
logger.error("Exception thrown", exception);
final StackTraceElement topElement = exception.getStackTrace()[0];
final Class callingClass = topElement.getClass();
final String methodName = topElement.getMethodName();
try {
// Can't get the method with just the name, need to
// know the params as well.
final Method method = callingClass.getMethod(methodName);
// Retrieve the annotation on the method and call the handler
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
}
}
还有其他方法可以这样做吗?参数不是堆栈跟踪的一部分。如果该方法是唯一的,即没有重载,您可能可以通过
getMethods()
找到它?我想到的其他一些东西,也许您可以在执行之前查看如何将该方法包装到某个处理程序中。可以在编译时或运行时完成
方面本身可以执行回滚,它可以使用您需要的信息丰富异常,或者它可以在重新引发异常之前,使用方法中定义的处理程序类设置一些ThreadLocal
变量。然后,您可以从捕获异常的点处的ThreadLocal
获取该值