Início > Programação > Como Encontrar Programaticamente um ManagedBean com Escopo de Sessão

Como Encontrar Programaticamente um ManagedBean com Escopo de Sessão

Quando um managed bean com qualquer escopo (View, Request ou Session) é referenciado por uma página xhtml, uma instância é criada caso ainda não tenha sido criada naquele escopo:

       [h:inputText value='#{viewMB.attribute}' /]

Nesse exemplo, uma instância de ViewMB será criada toda vez que a página for carregada supondo que ViewMB seja um bean com escopo de View.

Um problema recorrente que enfrento é como obter a instância atual de um managed bean de sessão à partir de um outro managed bean ou de um servlet. Suponha que tenhamos o bean de sessão abaixo:

@ManagedBean
@SessionScoped
public class SessionMB {
}

Para acessar a instância atual ou criar uma nova, faço assim:

public class ManagedBeanUtil {

	public static [T] T getSessionBean(HttpServletRequest request, Class[T] clazz, boolean create) {
		HttpSession session = (HttpSession) request.getSession(create);
		ManagedBean managedBean = clazz.getAnnotation(ManagedBean.class);
		Object bean = session.getAttribute(managedBean.name());
		if (bean == null) {
		        if (create) {
			        try {
				        bean = clazz.newInstance();
				        session.setAttribute(managedBean.name(), bean);
			        } catch (InstantiationException | IllegalAccessException e) {
				        throw new RuntimeException(e);
			        }
                        }
		}
		return (T) bean;
	}

}

O método da classe anterior recebe a request, uma classe e um booleano que indica se é para instanciar o managed de sessão e atribuí-lo a sessão caso ele não seja encontrado.

Para obter a instância do managed bean de sessão à partir de um outro managed bean, basta passar a request do FacesContext para o método utilitário:

@ManagedBean
@ViewScoped
public class ViewMB {
       public void execute(){
		HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
         	SessionMB sessionMB = ManagedBeanUtil.getSessionBean(request, SessionMB.class, true);
                // ...utilizacao do bean de sessao...
       }
}

Para obter a instância do managed bean de sessão à partir de um Servlet, ou seja, fora do contexto do Faces, basta passar a própria HttpServletRequest para o método utilitário:

@WebServlet(displayName = 'testServlet', name = 'TestServlet', urlPatterns = '/testservlet')
public class TestServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // Nada a fazer
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
			IOException {
		SessionMB sessionMB = ManagedBeanUtil.getSessionBean(request, SessionMB.class, true);
                // ...utilizacao do bean de sessao...
	}

}
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: