2015-01-06 3 views
2

Я разрабатываю приложение Spring-mvc.Весенние сервисы должны быть сериализуемыми

Я получаю NotSerializableException.

Исключение происходит при перезагрузке сервера. Я ищу решение и узнаю, что сеансовые бобы должны быть сериализованы.

My session scobe bean реализует сериализуемый, но он дает исключение для инжектируемых компонентов и бобин.

Он просит меня сериализовать все введенные компоненты и услуги.

Я сериализую свои бобы, но также требуется сериализовать службы.

Принято ли поведение для сериализации услуг также? Если да, то мне нужно будет сериализовать все службы в моих приложениях?

Спасибо.

+0

Неужели вы не можете сделать инъекционные услуги кратковременными? – StanislavL

+0

Это приведет к NPE в случае перезагрузки, исправьте меня, если я ошибаюсь. Ссылка http://stackoverflow.com/questions/7502891/getting-java-io-notserializableexception-with-a-spring-service-when-stopping-tom#comment9099441_7502939 –

+0

Вы имеете в виду «должно быть * Serializable *»? – EJP

ответ

2

Как Мээндра уже указывал:

В то время как десериализации объекта, переходные поля будут сбросить значение по умолчанию, так что вам может потребоваться повторная инициализация, используя if (transientField == null) {..}

Когда вы делаете сериализуемый компонент, m Убедитесь, что любая ссылка, которую вы не хотите хранить на диске, отмечена как переходная. Это означает, что после загрузки компонента вы повторно установите элементы компонента, которые были установлены как null.

, например:

private transient SomeService localServiceRef; 
SomeService getSomeService() { 
    if (localServiceRef == null) { 
     localServiceRef = SomeService.getInstance(); 
    } 
    return localServiceRef; 
} 

Или вы можете хранить идентификатор локально, и имеют преходящее Решенный объект

private String objectId; 
private transient SomeObject localObject; 
SomeObject getLocalObject() { 
    if (localObject == null) { 
     localObject = SomeObjectFactory.getById(objectId); 
    } 
    return localObject; 
} 

Хотя это конечно зависит от вашего фактического кода.

Лично я не люблю работать с бобами, которые фактически содержат услуги и т. П. Я предпочитаю иметь beans как объекты ценности и сервисы, которые можно найти с помощью других средств.

3

Tomcat сериализует сеансовую область сеанса всякий раз, когда вы перезапускаете или завершаете ее и восстанавливаете сеанс при запуске. Вы можете реализовать serializable для бобов, которые вы хотите восстановить. в противном случае пропустите эту ошибку.

Редактировать: Создание класса serializable означает, что класс не должен содержать несериализуемые ссылки или эти ссылки должны быть объявлены transient.

В то время как десериализации объекта, transient поля будут сброшены к значению по умолчанию, так что вам, возможно, придется повторно инициализировать его с помощью if(transientField == null) { .. }

+0

Как упоминалось в комментариях, ссылаясь на временные результаты в NPE. Я просто проверяю, могу ли я решить эту проблему. Мой последний вариант - избежать этого. –

+2

@ Mathendra может быть полезным для продления ответа инструкциями о необходимости перестановки переходных переменных на загрузку сеанса. (обычно: if (... == null) {...}. хотя лично я считаю, что состояние состояния сеанса должно содержать ссылки на внешние службы, но похоже, что у человека, задающего вопрос, есть это. – Joeblade

+0

@Joeblade , ваш вопрос ответил на мой вопрос. Я удалю ссылку на внешнюю службу, это возможно в моем случае. Хотя в случае использования ссылки на внешнюю службу мне придется использовать if (... == null) {. ..} в каждом методе сессионного компонента, где я использую внешние службы. Можете ли вы добавить это в ответ, чтобы я мог его принять. Спасибо. –

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