如果以前曾问过这个问题,我很抱歉。我是Spring框架的新手,我有一个关于 @Transactional 的实际问题以及我遇到的问题。
在循环中,我使用JDBC和SQL存储过程将一些对象插入数据库。某些/无/所有对象的插入可能由于某种原因而失败。如果所有插入都没有错误,否则必须做两件事。首先,需要回滚所有成功的插入,并且必须返回所有错误的列表。
到目前为止,我已经提出了一个执行回滚的代码,但我无法弄清楚如何返回带有错误的数组。
@Transactional
public String[] insertSomeObjects(SomeObject[] some){
List<String> errors = new ArrayList<String>();
for(SomeObject temp:some){
try{
jdbcInsertFunction(temp);
}catch(Exception ex){ // If error occurs, ad it to error list
String error = createProperErrorMessage(ex);
errors.Add(error);
}
}
if (errors.size >0){
// If there are errors, throw exception and roll back
Throw new Exception
}
}
此代码工作正常,它插入所有对象,如果其中任何一个失败,它会回滚。问题是我无法返回错误列表。
你知道如何解决这个问题吗?
答案 0 :(得分:1)
您可以使用suppressed例外:
public static void main(String[] args) throws TransactionRolledbackException {
TransactionRolledbackException te = null;
for (int i = 0; i < 3; i++) {
try{
//doStuff
throw new NullPointerException("Exception no:" + i );
}catch (Exception e) {
if(te == null){
te = new TransactionRolledbackException();
}
te.addSuppressed(e);
}
}
if(te != null){
throw te;
}
}
输出:
Exception in thread "main" javax.transaction.TransactionRolledbackException
at chapter4.Exceptionsss.main(Exceptionsss.java:18)
Suppressed: java.lang.NullPointerException: Exception no:0
at chapter4.Exceptionsss.main(Exceptionsss.java:15)
Suppressed: java.lang.NullPointerException: Exception no:1
at chapter4.Exceptionsss.main(Exceptionsss.java:15)
Suppressed: java.lang.NullPointerException: Exception no:2
at chapter4.Exceptionsss.main(Exceptionsss.java:15)
答案 1 :(得分:0)
到目前为止,我已经提出了一个执行回滚的代码,但我无法弄清楚如何返回带有错误的数组。
如果您尝试返回错误,而您所能做的就是抛出异常,那么您可以编写自己的异常,其中包含List<String> errors
字段。然后你会这样做:
throw new ExceptionWithErrors(cause, errors);
当您在调用者中捕获异常时,您可以调用ewe.getErrors()
。我倾向于不在异常中存储数据,因为我已经看到了这样做的一些非常糟糕的例子,但在你的情况下,如果你存储错误细节,那么这种模式似乎是一个好的。
这种机制可能存在的问题是,当退出事务导致回滚时,我遇到了问题。我在抛出异常时甚至遇到了问题,但是当事务结束时,生成了另一个异常并且第一个异常(带有错误上下文)丢失了。