setAttribute: несериализуемый атрибут (сериализация Java-объектов) - PullRequest
5 голосов
/ 02 ноября 2009

Мы только что перешли на Glassfish V2. Теперь мы получаем ошибки при установке атрибута сеанса.

Ошибка:

java.lang.IllegalArgumentException: PWC2788: setAttribute: Non-serializable attribute

Код:

getRequest().getSession().setAttribute("questionsForUser", getQuestions());

getQuestions () - это просто простой метод получения, который находится внутри абстрактного класса с именем 'Parent Action' .... поэтому чтобы сделать getQuestions () сериализованным объектом, мой класс должен реализовать serializable?:

public List getQuestions() {
    return questions;
}
  • Как мы можем сделать этот объект сериализуемый
  • это хорошая практика, чтобы положить только сериализованный объект в сеансе (как Glassfish, кажется, требует)?
  • Есть ли риск того, что сессии поменялся местами между пользователями с сериализованным объекты?

Редактировать: я использую ORM (iBatis)

Подробнее о "Вопросах"

сеттер:

public void setQuestions(List questions) {
    this.questions = questions;
}

setter вызывается внутри этого метода. этот метод вызывает сопоставления iBatis.

public void prepareQuestions()
{        
setExamIfaceDAO((SecurityExamIfaceDAO)ApplicationInitializer.getApplicationContext().getBean("securityExamIfaceDAO"));
    String userRole = questionsBasedOnUserRole();
    int questionsToBeShown = 0;
    if (userRole.equalsIgnoreCase("C"))
        questionsToBeShown = 15;
    else if (userRole.equalsIgnoreCase("U"))
        questionsToBeShown = 10;
    List local_questions = getExamIfaceDAO().getSecurityQuestions(userRole);
    Collections.shuffle(local_questions);
    if (local_questions.size()>=questionsToBeShown)
        setQuestions(local_questions.subList(0, questionsToBeShown));
    getRequest().getSession().setAttribute("questionsForUser", getQuestions());
}

Ответы [ 4 ]

10 голосов
/ 02 ноября 2009

Вы можете сделать сериализуемый объект, используя сериализуемую реализацию List и убедившись, что объекты в списке также сериализуемы.

Да - рекомендуется помещать в сеанс только сериализуемые объекты, поскольку это позволит вашему приложению работать на сервере с несколькими узлами. Даже если вы не заботитесь об этом в данный момент, это может пригодиться в будущем.

Контейнер сервлета должен гарантировать, что сеансы не переставляются между пользователями. Создание объектов, хранящихся в сериализуемом сеансе, позволяет контейнеру «распределять» состояние сеанса по нескольким узлам в кластере, позволяя пользователю, которому принадлежит сеанс, обслуживать запросы любым узлом.

3 голосов
/ 02 ноября 2009

Требуется, чтобы они были сериализуемыми, потому что спецификация сервлета говорит, что они должны быть, если тег "распространяемый" находится в web.xml. В спецификации предполагается, что механизмы сервлетов будут реплицировать сеансы между службами с использованием сериализации.

Единственный способ сделать его сериализуемым - это ... использовать реализацию List, которая сериализуема! Вы должны написать свой собственный класс List, поскольку все реализации в JDK являются сериализуемыми, о которых я знаю. Либо это, либо объекты в списке не сериализуемы.

Или вы можете просто удалить «распространяемый», если вам все равно, реплицируются ли ваши сеансы на несколько серверов или нет.

0 голосов
/ 02 ноября 2009

Все коллекции JDK сериализуемы , если их элементы сериализуемы . Я предполагаю, что это элементы List , которые не сериализуются, а не сам объект List. Чтобы (чрезмерно) упростить, чтобы объект был сериализуемым, он должен:

  • Реализация Сериализуемый
  • Имеют только нестатические непереходные поля, которые также сериализуемы
0 голосов
/ 02 ноября 2009

Какой тип объектов содержится в Списке? То есть что общего типа списка? Это Список или Список , в котором Вопрос является доморощенным классом javabean? Если последнее имеет место, вы должны позволить ему реализовать java.io.Serializable . Это в основном все. Для этого также требуется спецификация javabean.

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