2009-11-02 10 views
5

Właśnie przełączyliśmy się na Glassfish V2. Otrzymujemy teraz błędy podczas ustawiania atrybutu sesji.setAttribute: atrybut niezdolny do szeregowania (Java Serialization Object)

Błąd jest:

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

Code jest:

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

getQuestions() jest tylko prosty getter, który jest wewnątrz klasy abstrakcyjnej nazwie 'Parent Action' .... tak, aby getQuestions (i) w odcinkach obiekt robi moja klasa potrzebę wdrożenia serializacji ?:

public List getQuestions() { 
    return questions; 
} 
  • Jak możemy uczynić ten obiekt serializowalnym ?
  • Czy to dobra praktyka, aby umieszczać tylko zserializowany obiekt w sesji (jako Glassfish wydaje się wymagać)?
  • Czy istnieje ryzyko zamiany sesji między użytkownikami z serializowanymi obiektami z numerem seryjnym ?

Edycja: używam ORM (iBatis)

więcej informacji na temat "Pytania"

seter:

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

seter nazywa się wewnątrz tej metody. ta metoda wywołuje mapowania 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()); 
} 
+0

Dla każdego z podobnego problemu : gdy wykonasz listę podrzędną na liście, otrzymasz RandomAccessList, która nie implementuje Serializable. Rozwiązaniem jest więc dodanie wszystkiego do zeskanowanej listy, takiej jak ArrayList. – Omnipresent

Odpowiedz

9

Można dokonać serializacji obiektu za pomocą szeregowej implementacji List i upewniając się, że obiekty na liście są również szeregowalne.

Tak - to dobra praktyka, aby umieszczać tylko obiekty serializowalne w sesji, ponieważ pozwoli to na uruchomienie aplikacji na serwerze z wieloma węzłami. Nawet jeśli nie dbasz o to w tej chwili, może się to przydać w przyszłości.

Kontener serwletów powinien zapewniać, że sesje nie będą wymieniane między użytkownikami. Tworzenie obiektów przechowywanych w serii umożliwiającej serializację umożliwia kontenerowi "dystrybucję" stanu sesji przez wiele węzłów w klastrze, umożliwiając użytkownikowi, który jest właścicielem sesji, obsługę żądań obsługiwanych przez dowolny węzeł.

2

Jest wymagającą serializacji ponieważ spec serwletu mówi, że muszą być jeśli „podziałowi” tag w web.xml. Specyfikacja zakłada, że ​​silniki serwletów będą replikować sesje między usługami przy użyciu serializacji.

Jedynym sposobem na przekształcenie go do postaci szeregowej jest ... użycie implementacji listy, którą można serializować! Musisz napisać własną niestandardową klasę List, ponieważ wszystkie implementacje w JDK są serializowane, o których wiem. Tego lub obiektów na liście nie można szeregować.

Lub możesz po prostu usunąć "dystrybucję", jeśli nie obchodzi cię, czy twoje sesje zostaną zreplikowane na wielu serwerach, czy nie.

+0

lol ... def nie napisał mojej własnej niestandardowej klasy listy ... – Omnipresent

+0

Być może obiekty na twojej liście nie podlegają serializacji, wtedy .. –

+0

Skąd pochodzą "pytania"? Czy korzystasz z ORM? Wiele ORMów (takich jak Hibernate) wprowadza własne implementacje kolekcji. Prawdopodobnie musisz odwijać swoje pytania i zawinąć je do zwykłej tablicy ArrayList. Proszę również opublikować definicję klasy Pytania. – mhaller

0

Jakie typy obiektów zawiera Lista? To znaczy. jaki jest ogólny typ listy?Czy jest to lista <String> lub lista <Pytanie> w którym Pytanie jest rodzimą klasą javabean? Jeśli to drugie, musisz pozwolić mu wdrożyć java.io.Serializable. To w zasadzie wszystko. Wymagana jest również specyfikacja javabean, aby to zrobić.

0

Wszystkie kolekcje JDK można szeregować , jeśli ich elementy można szeregować. Domyślam się, że nie są to obiekty serializowalne, a nie sam obiekt List. Do (nad-) uproszczenie, dla obiektu będzie serializable musi:

  • Wdrożenie Serializable
  • mieć tylko niestatyczny non-nieustalonych pól, które są również serializable
Powiązane problemy