Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的回滚注释_Java_Spring_Transactions - Fatal编程技术网

Java中的回滚注释

Java中的回滚注释,java,spring,transactions,Java,Spring,Transactions,我的应用程序中有服务调用,可以对其他服务以及DB调用进行远程网络调用。Spring Boot很好地支持使用@Transactional回滚错误事务,但我想知道是否可以使用注释定义自定义回滚过程 我需要回滚其他服务以及数据库上的数据 在代码中,我可以这样做: @Transactional public void doSomethingComplicated() { try { srvcOne.makeRemoteNetworkCall(); srvcTwo.

我的应用程序中有服务调用,可以对其他服务以及DB调用进行远程网络调用。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();
}
但我希望我能做这样的事情:

@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
获取该值