2014-10-03 2 views
0

My Grails Service вызывает плагин, который генерирует исключение во время выполнения. В моем случае, я не забочусь об исключении, поэтому он проглатывается.Grails UnexpectedRollbackException в контроллере

MyGrailsService { 
    def myMethod { 
     ... 
     try { 
      //callPlugin 
     } catch (Exception ex) { 
       ... 
     } 
    } 
} 

Все прекрасное, исключение поймано и обработка продолжается. Однако в моем контроллере у меня есть блок catch (Throwable t), который я не ожидаю получить, потому что исключение проглочено. Оказывается, блок catch (Throwable t) выполнен, потому что Grails выбрасывает a org.springframework.transaction.UnexpectedRollbackException , который, конечно, я не хочу, чтобы это делалось. Наверное, я получаю это, потому что исключение, которое плагин вызывает, - это время выполнения, поэтому Grails откатывает транзакцию.

Я не хочу, чтобы этот UnexpectedRollbackException был брошен.

Любые советы?

+1

Я столкнулся с подобной ситуацией и был так же озадачен. В моем случае это было чистое и прагматичное решение, позволяющее исключить исключение из исключения, прежде всего, путем проверки данных перед вызовом функции. Но, очевидно, существует множество сценариев, в которых это невозможно или желательно. – peterp

ответ

0

Что я сделал бы это

class MyService{ 

    static transactional = false 

    def myMethod { 
     ... 
     try { 
      //callPlugin 
     } catch (Exception ex) { 
       ... 
     } 
    } 

    @Transactional(readOnly = true) 
    def someMethod { 
    // Some code here 
    } 


} 

Приведенный выше код сделает все методы обслуживания, не транзакционных и мы будем явно делают методы транзакционных которые мы хотим.

Однако еще одна вещь, которую нужно позаботиться, метод плагина, который вы вызываете, этот метод может быть транзакционным методом, который по ошибке может быть откатным и выбросить исключение UnexpectedRollbackException. Поэтому вы должны проверить его один раз, если метод плагина является транзакционным.

Смежные вопросы