2016-07-08 3 views
1

У меня есть приложение Grails 3 (3.1.1), которое реализует систему Breadcrumb. Я основывал его на this plugin для более ранней версии Grails.Grails Session-scoped Service throwing NotSerializable Exception

Он прекрасно работает локально (с помощью Grails Командной строки run-app), однако, когда я построить и запустить на сервере Tomcat 7, я получаю следующее исключение:

Jul 08, 2016 5:10:34 PM org.apache.catalina.ha.session.DeltaManager requestCompleted 
SEVERE: Unable to serialize delta request for sessionid [6605EAC9C04DF7E2512493CABDFB1AD2] 
java.io.NotSerializableException: au.packagename.BreadCrumbService 

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

class BreadCrumbService implements Serializable { 

    static transactional = false 
    static scope = 'session' 
    static proxy = true 

} 

У меня есть Interceptor, который использует службу, чтобы написать текущий контроллер и действие в качестве Crumb объекта к сессии. Я добавил реализацию Serializable в Crumb и BreadCrumbType Enum (используется в аннотации Controllers), которая записывается в сеанс.

Может ли кто-нибудь указать мне, почему это может произойти (я понимаю концепцию Serializable) и как я могу решить ее?

+0

Вы уверены, что все члены BreadCrumbService являются временными или Serializable? –

ответ

0

@ Комментарий Хоанга Лонга поставить меня на правильный путь.

При записи объекта Crumb (все из которых были сделаны Serializable) в сеанс, я использовал статическую переменную в BreadCrumbService для ключа карты сеанса.

session[BreadCrumbService.NAMESPACE].crumb = new Crumb() 

Когда я переместил эту переменную в объект Crumb, проблема была решена.

Несмотря на то, что сама Служба не была записана на сеанс. Простое указание на переменную внутри Сервиса при записи на сеанс требовало, чтобы служба и каждый член были Serializable.