Как вернуть все ошибки из метода, помеченного @Transactional?

Прошу прощения, если этот вопрос был задан ранее. Я новичок в Spring Framework и у меня есть практический вопрос о @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 ответа

Вы можете использовать подавленные исключения:

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)

До сих пор я придумал код, который выполняет откат, но я не могу понять, как вернуть массив с ошибками.

Если вы пытаетесь вернуть ошибки, и все, что вы можете сделать, это выбросить исключение, то вы можете написать собственное исключение, которое имеет List<String> errors поле в нем. Тогда вы бы сделали:

throw new ExceptionWithErrors(cause, errors);

Когда вы перехватываете исключение обратно в вызывающей стороне, вы можете позвонить ewe.getErrors(), Я склонен не хранить данные в исключениях, потому что я видел некоторые действительно плохие примеры этого, но в вашем случае, если вы храните подробности об ошибках, тогда этот шаблон кажется хорошим.

Возможная проблема с этим механизмом состоит в том, что у меня были проблемы, когда выход из транзакции является причиной отката. У меня даже были проблемы, когда я генерирую исключение, но затем, когда транзакция завершается, генерируется другое исключение, и первое (с контекстом ошибки) теряется.

Другие вопросы по тегам