Мы заметили, что после обновления Grails 3.1.11 до 3.2.0 одно действие контроллера больше не работает:
@Transactional(readOnly = true)
class RoomPlanController {
...
def show(RoomPlan roomPlan) {
...
}
def getRooms(RoomPlan roomPlan) {
...
}
}
Проблема в том, что когда мы вызываем roomPlan/getRooms/1
, roomPlan
равно нулю. Если мы вызываем действие show
с тем же параметром, roomPlan устанавливается правильно.
Вызов getErrors()
внутри контроллера дает нам следующее сообщение об ошибке:
Не удалось получить текущий сеанс гибернации; вложенным исключением является org.hibernate.HibernateException: сеанс не найден для текущего потока
который происходит от grails.artefact.Controller.initializeCommandObject. После еще одной отладки я заметил разницу в трассировке стека между show
и getRooms
.
Трассировка стека show
:
show:100, RoomPlanController (at.byte_code.businessSuite.hotel)
$tt__show:-1, RoomPlanController (at.byte_code.businessSuite.hotel)
doCall:-1, RoomPlanController$_show_closure13 (at.byte_code.businessSuite.hotel)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
Трассировка стека getRooms
:
getRooms:109, RoomPlanController (at.byte_code.businessSuite.hotel)
getRooms:-1, RoomPlanController (at.byte_code.businessSuite.hotel)
invoke0:-1, NativeMethodAccessorImpl (sun.reflect)
Сообщение об ошибке и другая трассировка стека позволяют предположить, что это как-то связано с сеансом/транзакцией базы данных, и после добавления @Transactional(readOnly = true)
к действию все работает, как и ожидалось, и до обновления до grails 3.2.0. Если мы удалим аннотацию и снова произойдет сбой.
Мы не смогли увидеть проблему ни в одном другом контроллере и не смогли воспроизвести ее в небольшом тестовом проекте. Мы уже пытались пересобрать проект, также на полностью новой рабочей станции нас не было.
Кто-нибудь еще наблюдал такую проблему?