Uso EJB3 e gostaria de criar um stateful session bean com o usuario logado. O problema que tenho é :
Toda vez que eu faço lookup do stateful, uma nova instancia do stateful é criado. Não desejo armazenar o statefull na sessão http, gostaria de recuperar do container a instancia já existente.
O problema é que eu não quero pegar o usuario (e outras informações referentes ao login) do meu stateful na camada web, e ter que ficar passando ele como parametro pra camada de negocio.
Gostaria que a camada de negocio pudesse buscar essa informação que está no Statefull que já existe no container.
Vc esta usando um statefull só pra persistir o usuário logado ??
Acho q pra fazer o que vc quer, tem q ser diferente.
O statefull faz um lookup local para algum stateless passando o usuario que já esta logado. E não o cliente (web) passar o cliente que já esta logado como parâmetro.
Na tela de login, o usuario entra com nome de usuario, senha e o local onde está logado.
O Local onde o usuario está logado irá ser utilizado em praticamente todas as funcionalidades do sistema, e eu não gostaria de ficar passando isso por parametro da camada de visualização para a camada de negócio.
Então eu pensei em deixar isso em um contexto onde minha camada de negócio pudesse obter essa informação, sem receber por parametro. Como não é possivel inserir informação no SessionContext, eu pensei em manter isso em um Stateful, onde quem precisasse dessa informação faria um lookup.
Porém, a cada lookup, o container me devolve uma nova instância do stateful, e por isso não estou conseguindo recuperar essa informação dentro da camada de negócio sem receber como parametro da camada web.
Acho que tornar isso persistente ou um simples mapa no lado do servidor é mais produtivo… o problema é que se não quiser tornar persistente vai virar um singleton.
Qual a sua arquitetura? O Jboss Seam faz isso pelo application context. Acho que o Spring também faz algo parecido…
As tecnologias utilizadas são basicamente servlet + velocity/ Ejb3 / JPA.
Resolvi o problema tornando o local de ultimo login persistente.
Eu gostaria de utilizar spring no projeto, porém, por uma questão de falta de conhecimento da equipe, optamos por ejb.
Fiquei decepcionado por não conseguir fazer isso com ejb, pois eu acreditava que o container injetaria a mesma instancia de stateful para a mesma sessão de usuário, porém, lendo a spec, percebi que não é isso o esperado. Ao fazer lookup o container sempre cria uma nova instancia, e você é responsável por manter a referência para o Stateful.
Você prode resolver tudo isso utilizando a própria estrutura de segurança que o seu container EJB.
Inclusive você pode customizar o teu Principal, adicionando o “local onde está logado”.