Как вернуть все ошибки из метода, помеченного @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()
, Я склонен не хранить данные в исключениях, потому что я видел некоторые действительно плохие примеры этого, но в вашем случае, если вы храните подробности об ошибках, тогда этот шаблон кажется хорошим.
Возможная проблема с этим механизмом состоит в том, что у меня были проблемы, когда выход из транзакции является причиной отката. У меня даже были проблемы, когда я генерирую исключение, но затем, когда транзакция завершается, генерируется другое исключение, и первое (с контекстом ошибки) теряется.