Перехват ClassCastException, когда вы сохраняете объект в сеансе и пытаетесь получить к нему доступ после нового развертывания? - PullRequest
2 голосов
/ 08 декабря 2010

Я сталкиваюсь с ситуацией, когда при сохранении формы в сеансе после нового развертывания войны и попытки доступа к форме я получаю исключение java.lang.ClassCastException.

Чтобы сделать это прозрачным для пользователя, я написал следующий код:

try {
        command = (ReservationOfBooksCommand) request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
    } catch (ClassCastException e) {
        request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
    }

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 08 декабря 2010

Вы можете использовать оператор instanceof

Object command = request.getPortletSession().getAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);

if(!(command instanceof ReservationOfBooksCommand)){
        request.getPortletSession().removeAttribute(RESERVATION_OF_BOOKS_COMMAND_SESSION_NAME);
}else{
   ...
}
1 голос
/ 08 декабря 2010

Поскольку вы пометили этот вопрос tomcat, я предлагаю вам:

  1. Создать META-INF/context.xml в вашем собственном веб-приложении.
  2. Добавить следующий кодстрока внутри context.xml.

Пример:

<context>
    <!-- stuff here-->

    <!-- Persistence Manager. This handles all of session Tomcat handles from our app. -->
    <Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false">
        <Store className="org.apache.catalina.session.FileStore" /> 
    </Manager>

</context>

Как сказал Майкл Баркер, большинство серверов приложений очищает запросы и сеансы после повторного развертывания по умолчанию.

Чтобы Tomcat мог сохранить сеанс, установите saveOnRestart="true".Это позволяет tomcat хранить сеанс, используя PersistentManager в FileStore (то есть использовать систему хранения файлов вместо системы хранения базы данных).

Надеюсь, это поможет.

0 голосов
/ 08 декабря 2010

Некоторые серверы приложений позволяют очистить сеансы перед повторным развертыванием. Например, Resin будет продолжать использовать старый код для старого сеанса, перемещая новые сеансы в новый код. Очевидно, что в какой-то момент вам нужно будет прервать сеанс пользователей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...