2009-11-02 30 views
5

Acabamos de cambiar a Glassfish V2. Ahora estamos obteniendo errores al configurar un atributo de sesión.setAttribute: atributo no serializable (Serialización de objetos Java)

error es:

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

Código es:

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

getQuestions() es simplemente un captador simple que se encuentra dentro de una clase abstracta llamada 'Padres en Acción' .... por lo que para hacer getQuestions() de un objeto serializado hace mi necesidad clase para implementar serializable ?:

public List getQuestions() { 
    return questions; 
} 
  • ¿Cómo podemos hacer que este objeto serializable?
  • ¿es una buena práctica poner solo el objeto serializado en la sesión (como parece estar requiriendo Glassfish)?
  • ¿Hay riesgos de que las sesiones sean intercambiadas entre usuarios con objetos serializados ?

Editar: Estoy utilizando ORM (iBatis)

más información sobre "Preguntas"

colocador:

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

colocador se llama dentro de este método. este método llama a las asignaciones de 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

Para cualquier persona con problema similar : cuando haces una sublista en una lista obtienes RandomAccessList que no implementa Serializable. Entonces la solución es agregar todo a una lista de búsqueda como ArrayList. – Omnipresent

Respuesta

9

Puede hacer que el objeto se pueda serializar utilizando una implementación de lista serializable y asegurándose de que los objetos en la lista también sean serializables.

Sí, es una buena práctica colocar únicamente objetos serializables en la sesión, ya que esto permitirá que la aplicación se ejecute en un servidor con múltiples nodos. Incluso si no te importa esto en este momento, podría ser útil en el futuro.

El contenedor de servlets debe garantizar que las sesiones no se intercambien entre los usuarios. Hacer que los objetos almacenados en la sesión sean serializables permite que el contenedor 'distribuya' el estado de la sesión a través de múltiples nodos en un clúster, permitiendo que el usuario propietario de la sesión tenga solicitudes atendidas por cualquier nodo.

2

Se exige que los vegetales serializable porque la especificación servlet dice que tienen que ser si la etiqueta "distribuible" es en web.xml. La especificación asume que los motores de servlets replicarán sesiones en todos los servicios mediante serialización.

La única manera de hacer que sea serializable es ... usar una implementación de List que sea serializable. Debe haber escrito su propia clase de lista personalizada, ya que todas las implementaciones en el JDK son serializables que yo sepa. O eso o los objetos en la lista no son serializables.

O simplemente podría eliminar el "distributable" si no le importa si sus sesiones se replican en varios servidores o no.

+0

lol ... def no escribió mi propia clase de lista personalizada ... – Omnipresent

+0

Tal vez los objetos en su lista no son serializables entonces ... –

+0

¿De dónde vienen las "preguntas"? ¿Estás usando un ORM? Muchos ORM (como Hibernate) presentan sus propias implementaciones de Colección. Probablemente necesites desenvolver tus preguntas y envolverlas en una ArrayList normal. Por favor, también publique la definición de clase de la clase Pregunta. – mhaller

0

¿Qué tipo de objetos contiene la Lista? Es decir. ¿Cuál es el tipo genérico de la lista?¿Es List <String> o List <Pregunta> donde Question es una clase de Java cultivada internamente? Si este es el caso, debe dejar que implemente java.io.Serializable. Eso es básicamente todo. La especificación javabean también te exige que lo hagas.

0

Todas las colecciones de JDK son serializables si sus elementos son serializables. Supongo que es la lista elementos que no son serializables, no el objeto List en sí. A (sobre) simplificar, para que un objeto serializable debe ser:

  • Implementar Serializable
  • Sólo tienen campos no estáticos no transitorios que también son serializable
Cuestiones relacionadas