1
我在我的應用程序的服務電話,使遠程網絡調用其他服務,以及DB調用。春季啓動對回滾壞交易與@Transactional
良好的支持,但我想知道如果我可以定義使用註釋定製的回退過程。回滾註釋在Java中
我需要回滾對其他服務的數據以及數據庫。
在代碼中,我能做到這一點是這樣的:
@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();
}
}
我實現了一個全局異常監聽器,我能夠得到異常來自的類,但我沒有辦法得到實現方法具d並檢索其上的任何註釋。這是我最初的嘗試:
@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();
}
}
}
有沒有辦法做這樣的事情?