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

StackOverflow https://stackoverflow.com/questions/4391462

Вопрос

Я сталкиваюсь с ситуацией, когда, если я сохранил форму в сессии, после того, как я сделал новое развертывание войны и пытаясь получить доступ к форме, я получаю 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);
    }

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

Спасибо.

Это было полезно?

Решение

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

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{
   ...
}

Другие советы

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

  1. Создать META-INF/context.xml в вашем собственном веб -приложении.
  2. Добавьте следующую строку кода в контекст.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 (То есть используйте систему хранения файлов вместо системы хранения базы данных).

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top