如何从@Transactional标记方法返回所有错误?

时间:2017-03-10 20:55:24

标签: java spring transactional

如果以前曾问过这个问题,我很抱歉。我是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
    }
}

此代码工作正常,它插入所有对象,如果其中任何一个失败,它会回滚。问题是我无法返回错误列表。

你知道如何解决这个问题吗?

2 个答案:

答案 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()。我倾向于不在异常中存储数据,因为我已经看到了这样做的一些非常糟糕的例子,但在你的情况下,如果你存储错误细节,那么这种模式似乎是一个好的。

这种机制可能存在的问题是,当退出事务导致回滚时,我遇到了问题。我在抛出异常时甚至遇到了问题,但是当事务结束时,生成了另一个异常并且第一个异常(带有错误上下文)丢失了。