¿Es útil establecer objetos en la sesión que ya existen en una aplicación web Java?

En nuestra aplicación web Java que usa Struts 1, tenemos mucho código que esencialmente hace esto:

HttpSession session = httpServletRequest.getSession();
MyObject myObject = session.getAttribute(MY_OBJECT_KEY);

//code that mutates myObject - setting properties or whatever

session.setAttribute(MY_OBJECT_KEY, myObject);

Mi pregunta: ¿Es necesaria la última línea, session.setAttribute(..)? Me parece inútil: 'myObject' y 'session.getAttribute (...)' se refieren a la misma ubicación en la memoria, ¿verdad? Entonces, ¿no debería ser necesario restablecer el atributo en la sesión? ¿Esto hace algo de lo que no soy consciente? El objeto no implementa HttpSessionBindingListener que se menciona en la documentación.

Siento que necesito verificar dos veces porque esto se hace en toda esta aplicación y ciertamente no quiero romper nada solo porque estoy limpiando el código. Gracias

preguntado el 27 de julio de 12 a las 17:07

2 Respuestas

Depende de lo que entiendas por "mutar". Si "mutar" en este contexto significa que cambió las propiedades, pero no la instancia, entonces no, no es necesario setAttribute al final.

myObject es un referencia al objeto subyacente. La sesión tiene su propia referencia. Ambos apuntan al mismo objeto subyacente, por lo que estaría cambiando propiedades en la misma instancia.

Ahora si lo haces

myObject = new MYObject();

ENTONCES necesita pasar el nuevo objeto a la sesión. En este caso, su referencia myObject ahora apunta a una instancia diferente a la referencia de la sesión.

Tenga en cuenta, ¿por qué no escribir una prueba unitaria y probarla?

Respondido 27 Jul 12, 17:07

Gracias, a veces solo necesito que me digan lo que ya sé. Mi confusión se debió a un comentario en el código fuente que parecía indicar que session.setAttribute estaba haciendo algo que no hace. También tienes razón sobre la prueba unitaria.. - emulsionar

AFAIK setAttribute no hace nada raro. Del javadoc "Vincula un objeto a esta sesión, usando el nombre especificado. Si un objeto con el mismo nombre ya está vinculado a la sesión, el objeto se reemplaza". - codigoshvgot

@emulcahy, sé que esta es una publicación antigua. Me topé con esto mientras investigaba sobre los oyentes de Servlet. ¿Descubrió el motivo de esos atributos "redundantes"?

Me pregunto si se agregaron para desencadenar eventos en los oyentes de Servlet. Es posible que desee verificar si hay algún objeto que implemente HttpSessionAttributeListener o HttpSessionBindingListener. Pueden usarse para registrar información en esas variables de sesión. Solo un pensamiento. Si ya resolvió su problema, ignore este mensaje.

Respondido 02 Oct 12, 00:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.