Hola.
Estaba probando si los EJB Stateless podían mantener la sesión de los clientes como hacen los servlets, ya que requiero de crear una interfaz de servicos web RESTful para mi proyecto. Al ejecutar la prueba, me he encontrado con un error bastante curioso.
La prueba consiste en almacenar un número que se le pasa por la query de la URL del método GET. Si ya tiene un número almacenado, guarda ése como old y almacena el nuevo como n, todo ello en la HttpSession. La cosa es que se produce un error NullPointerException en ejecuciones alternas. Es decir, si lanzo 5 veces la petición, la primera, tercera y quinta vez, funciona perfectamente, pero la segunda y la cuarta, salta la excepción.
Dejo a continuación el código que, como nota, había funcionado a la perfección en un Tomcat 7 sin la anotación Stateless. Ahora lo estoy corriendo sobre GlassFish 4, y he tenido que meter la anotación @Stateless porque también necesito que mis servicios capturen el EntityManager del PersistenceContext.
package org.udyat.controller;
import javax.ejb.Stateless;
import javax.servlet.http.HttpSession;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
@Stateless
@Path("/pruebasesion")
public class PruebaSesionRest extends AbstractRestService {
/**
*
*/
public PruebaSesionRest() {
super();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getNumeros(@QueryParam("numero") Integer n) {
HttpSession sesion = this.getRequest().getSession(true);
Integer old = null;
if (sesion.getAttribute("n") == null)
sesion.setAttribute("n", n);
else {
old = (Integer) sesion.getAttribute("n");
sesion.setAttribute("old", old);
sesion.setAttribute("n", n);
}
JsonObject json = new JsonObject();
json.addProperty("n", n.toString());
if (old != null)
json.addProperty("old", old.toString());
return new Gson().toJson(json);
}
}
La excepción salta en esta línea:
if (sesion.getAttribute("n") == null)
espero que alguien pueda ayudarme, porque no entiendo el motivo de este comportamiento anómalo ^^'