gpt4 book ai didi

java - Java中的回滚注解

转载 作者:行者123 更新时间:2023-11-30 06:30:33 24 4
gpt4 key购买 nike

我的应用程序中有服务调用,这些服务调用对其他服务以及数据库调用进行远程网络调用。 Spring Boot 对使用 @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();
}

并在处理程序中:

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() 找到它?还有什么想到的,也许你可以看看Aspects在执行之前将方法包装在某个处理程序中。可以在编译时或运行时完成。

方面可以自己进行回滚,它可以用您需要的信息丰富异常,或者它可以使用重新抛出之前在方法中定义的处理程序类设置一些ThreadLocal变量异常(exception)。然后,您可以在捕获异常的地方从 ThreadLocal 获取该值。

关于java - Java中的回滚注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46245698/

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