entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

Extraña excepción en EJB Stateless al acceder a la HttpSession

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 ^^'

2 Respuestas

1voto

xabe Puntos2180

Hola

Tu problema es el siguiente, los servicios rest son sin estado (Stateless) es decir que no se guarda el estado, por lo que la variables que tengas en httpsession siempre van ser null en la siguiente petición, lo que tienes que hacer es guardalo es valor entro lugar, por ejemplo, base de datos, fichero , etc.

Saludos

0voto

kaiba78987 comentado

Eso era lo que me parecía, pero entonces, no entiendo por qué, por ejemplo, si la primera ejecución meto un 2 por parámetro, la segunda me da excepción, pero la tercera me sale bien, devolviendo el nuevo número y el 2 como old :s

0voto

xabe Puntos2180

Yo creo que es un bug de glassfish porque como dice la documentación:

getSession(boolean create)
Returns the current HttpSession associated with this request or, if there is no current session and create is true, returns a new session

en el código tu pasa el parámetro a true te tiene que devolver un objeto httpsession siempre y no dar la excepción de nullpointerexception

0voto

kaiba78987 comentado

Sí, eso es lo que pienso yo. Tendría sentido si la excepción me diera al intentar acceder a algún atributo dentro de la HttpSession, pero el caso es que es al acceder a la sesión, que la debería crear siempre... Por eso, no entiendo nada ^^'.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta