【问题标题】:How to return all errors from an @Transactional marked method?如何从 @Transactional 标记的方法返回所有错误?
【发布时间】:2017-03-10 20:55:24
【问题描述】:

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

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

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

【问题讨论】:

  • 只返回errors.toArray();
  • 在这种情况下你将如何进行回滚?
  • 为什么不把错误放到异常对象中呢?

标签: java spring transactional


【解决方案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)

【讨论】:

  • 其实很流畅!感谢您的回答。
  • @rob 我很高兴它有帮助
【解决方案2】:

到目前为止,我已经想出了一个执行回滚的代码,但我不知道如何返回一个包含错误的数组。

如果您尝试返回错误并且您所能做的就是抛出异常,那么您可以编写自己的异常,其中包含 List&lt;String&gt; errors 字段。然后你会这样做:

throw new ExceptionWithErrors(cause, errors);

当您在调用者中捕获异常时,您可以调用ewe.getErrors()。我倾向于不将数据存储在异常中,因为我已经看到了一些非常糟糕的这样做的例子,但在你的情况下,如果你正在存储错误详细信息,那么这种模式似乎是一个很好的模式。

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

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多