Hemos cambiado a Glassfish V2. Ahora estamos errores al establecer una sesión de atributo.

De Error es:

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

Código es:

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

getQuestions() es solo una simple getter que está dentro de una clase abstracta llamada «Matriz de Acción»….así que, para hacer getQuestions() de un objeto serializado ¿mi clase de la necesidad de implementar serializable?:

public List getQuestions() {
    return questions;
}
  • ¿Cómo podemos hacer que este objeto
    serializable?
  • es una buena práctica para sólo poner
    objeto serializado en la sesión (como
    Glassfish parece ser que requiere)?
  • Existen riesgos de sesiones de
    intercambiados entre los usuarios con serializado
    los objetos?

Edit: estoy usando ORM (iBatis)

Obtener más Información acerca de «Preguntas»

setter:

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

setter se llama dentro de este método. este método llama a la iBatis asignaciones.

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());
}
Para alguien con un problema similar: cuando usted hace una sublista en una Lista volver RandomAccessList que no implementar Serializable. Así que la solución es agregar todo a un searialized lista como ArrayList.

OriginalEl autor Omnipresent | 2009-11-02

4 Comentarios

  1. 10

    Puede hacer que el objeto serializable mediante el uso de un serializable Lista aplicación y asegurarse de que los objetos de la lista también son serializables.

    Sí, es una buena práctica para sólo poner objetos serializables en la reunión, ya que esto permitirá que la aplicación se ejecute en un servidor con varios nodos. Incluso si usted no tiene cuidado acerca de esto en el momento en que podría ser útil en el futuro.

    El contenedor de servlet debe asegurarse de que las sesiones no son intercambiados entre los usuarios. Hacer que los objetos almacenados en la sesión serializable permite que el contenedor de ‘distribuir’ 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 a tener solicitudes atendidas por ningún nodo.

    OriginalEl autor Andy

  2. 2

    Es la necesidad de que sean serializables porque el servlet especificación dice que tienen que ser si la «distribuible» tag está en web.xml. La especificación supone servlet motores de replicar las sesiones a través de los servicios de uso de la serialización.

    La única manera de hacer es ser serializable es… el uso de una aplicación de la Lista que es serializable! Usted debe tener por escrito su propia Lista personalizada de clase, ya que todas las implementaciones en el JDK son serializables, que yo sepa. O eso, o los objetos de la lista no son serializables.

    O usted podría eliminar el «distribuible» si a usted no le importa si sus sesiones se replican a través de múltiples servidores o no.

    lol…def no escribir mi propia Lista personalizada de clase…
    Tal vez los objetos de la lista no son serializables entonces..
    ¿De dónde «preguntas»? Es usted el uso de un ORM? Muchos Orm (como Hibernate) introducir sus propias implementaciones de Colección. Usted probablemente tiene que desdoblar sus preguntas y envolverlos en un ArrayList. Por favor, también después de la definición de clase de la clase de Pregunta.
    sí, estoy usando iBatim ORM. Por favor, ver mi edición

    OriginalEl autor Licky Lindsay

  3. 0

    Qué tipo de objetos se hace la Lista de contener? I. e. ¿cuál es el tipo genérico de la Lista? Es la Lista de<Cadena> Lista o<Pregunta> donde la Pregunta es una de cosecha propia clase de javabean? Si este es el caso, usted necesita para dejar de aplicar java.io.Serializable. Eso es básicamente todo. Usted también es requerido por el javabean especificación para hacerlo.

    OriginalEl autor BalusC

  4. 0

    Todo el JDK colecciones son serializables si sus elementos son serializables. Mi conjetura es la Lista de elementos que no son serializables, no el objeto de la Lista en sí. Para (sobre)simplificar, para que un objeto serializable debe:

    • Implementar Serializable
    • Sólo no estático no transitoria campos que también son serializables

    OriginalEl autor Ramon

Dejar respuesta

Please enter your comment!
Please enter your name here