5
respostas

Observar mudancas em um bean session scoped

Olá , é possível observar mudanças em determinado bean no escopo de sessao ? Algo parecido com o HttpSessionAttributeListener do HttpSession. Estou desenvolvendo uma lib e nao estou encontrando um jeito de ouvir essa mudança para componentes gerenciados pelo CDI . Seria algo nesse sentido.

@SuppressWarnings("serial")
@SessionScoped
public class TestSession implements Serializable {


private User user;
private String anotherAttribute;

public TestSession() {

}

public User getUser() {
    return user;
}

public void setUser(User user) {
    this.user = user;
}

}
@SuppressWarnings("serial")
@WebServlet(name = "demo", urlPatterns = "/demo")
public class DemoServlet extends HttpServlet {

private static final Logger logger = LoggerFactory.getLogger(DemoServlet.class);

@Inject
private TestSession testSession;

@Override
protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
        throws ServletException, IOException {

    User user = new User(1L,new Role(1L));
    user.setId(RandomUtils.nextLong());
    testSession.setUser(user); //É possível ouvir que o componente testSession sofreu uma alteracao em alguma de suas propriedades ?
   testSession.setAnotherAttribute(random);


    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/jsp/demo.jsp");
    dispatcher.forward(httpServletRequest, httpServletResponse);
}

Alguma ajuda com essa dificuldade ?

5 respostas

Oi Jonatan, não conheço uma forma automática de fazer isso não... Eu adicionaria um comportamento dentro de cada método desse bean mesmo, acho que ficaria até mais claro o que está acontecendo.

Bom como lib nao consigo interagir com a classe que dei exemplo adicionando codigo etc ja q e uma classe terceira . Mas tive uma ideia baseada na sua ideia. Escanear as classes que sao session scoped , varrer os metodos e adicionar uma anotacao em cada , criar um interceptor baseado nessa anotacao que dispara um evento pra um observer que executa meu codigo. Em teoria rolaria certo ?

Opa, essa até poderia funcionar, não é nada trivial.. Dá uma olhada nesse post => http://blog.caelum.com.br/trabalhe-com-cdi-extensions/

Deu certo. Porem outro problema surgiu . As anotacoes que adicionei usando o delta spike pelo processannottedtype nao ficam disponiveis por reflexao ? no interceptor passando invocationcontext.getTarget como referencia pro observer olhando por reflexao as anotacoes nao estao la porem o cdi entendeu para usar o interceptor. Consigo acessar essas anotacoes de outro modo ?

Putz, aí só se vc modificasse o bytecode mesmo. Uma outra solução, eh vc adicionar as annotations via pre processor do java mesmo. Todas são alternativas complicadas.