Забелязваме след актуализацията от Grails 3.1.11 до 3.2.0, че едно действие на контролер вече не работи:
@Transactional(readOnly = true)
class RoomPlanController {
...
def show(RoomPlan roomPlan) {
...
}
def getRooms(RoomPlan roomPlan) {
...
}
}
Проблемът е, че когато извикаме roomPlan/getRooms/1
roomPlan
е null. Ако извикаме действието show
със същия параметър roomPlan е зададен правилно.
Извикването на getErrors()
вътре в контролера ни дава следното съобщение за грешка:
Не може да се получи текущата сесия на хибернация; вложеното изключение е org.hibernate.HibernateException: Не е намерена сесия за текущата нишка
който има своя произход от grails.artefact.Controller.initializeCommandObject. След още известно отстраняване на грешки забелязах разлика в проследяването на стека между show
и getRooms
Stacktrace на 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)
Stacktrace на 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. Ако премахнем анотацията и отново се провали.
Не успяхме да видим проблема в нито един друг контролер и не успяхме да го възпроизведем в малък тестов проект. Вече се опитахме да възстановим проекта, също и на напълно нова работна станция, която не бяхме.
Някой друг наблюдавал ли е подобен проблем?