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());
}
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