Obter ManagedBean instanciado na sessão

Bom dia, GUJ!

Estou tentando entender o funcionamento dos Managed Bean e estou uma com dúvidas:

  • Tenho um Managed Bean que utiliza outro Managed Bean através da anotação Managed Property;
  • O Managed Bean utilizado é o UsuarioBean, ele é carregado dentro do Managed Bean Main;
  • Através do Managed Bean Main, gerencio os usuários e as mensagens a serem exibidas no painel;

Preciso obter o UsuarioBean instanciado, para que eu posso jogar ele no parâmetro de um método e estou com dificuldades. Poderiam também opinar sobre a forma que estou fazendo?

Obrigado.

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import com.marcelodeandrade.usuario.UsuarioBean;

@ManagedBean(name = "Main")

public class Main {

	@ManagedProperty(value = "#{UsuarioBean}")
	private UsuarioBean usuarioBean;	
	private PainelMensagem painelMensagem;

	public Main(){

		painelMensagem = PainelMensagem.getInstancia();
		//painelMensagem.adicionarObservador(getUsuarioBean());
				
	}
	
	public PainelMensagem getPainelMensagem() {
		return painelMensagem;
	}

	public void setPainelMensagem(PainelMensagem painelMensagem) {
		this.painelMensagem = painelMensagem;
	}

	public UsuarioBean getUsuarioBean() {
		return usuarioBean;
	}

	public void setUsuarioBean(UsuarioBean usuarioBean) {
		this.usuarioBean = usuarioBean;
	}
	

}
package com.marcelodeandrade.usuario;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import com.marcelodeandrade.observer.Observador;

@ManagedBean(name = "UsuarioBean")
@SessionScoped
public class UsuarioBean implements Observador{

		private Usuario usuario;

		public UsuarioBean(){
			this.usuario = new Usuario();	
		}

		public Usuario getUsuario() {
			return usuario;
		}

		public void setUsuario(Usuario usuario) {
			this.usuario = usuario;
		}

		@Override
		public void atualizarMensagem(String mensagem) {
			System.out.println(getUsuario().getApelido() + " : " + mensagem);
			
		}

		@Override
		public String toString(){
			return getUsuario().getApelido();
		}
}


import java.util.ArrayList;
import java.util.List;

import com.marcelodeandrade.observer.Objeto;
import com.marcelodeandrade.observer.Observador;
import com.marcelodeandrade.usuario.UsuarioBean;

public class PainelMensagem implements Objeto {

	private String mensagem;
	private List<Observador> observadores;
	private List<String> mensagens;
	private static PainelMensagem instancia;
	
	public PainelMensagem(){
		this.observadores = new ArrayList<Observador>();
		this.mensagens = new ArrayList<String>();
	}
	
	public static PainelMensagem getInstancia(){
		if( instancia == null){
			instancia = new PainelMensagem();
		} 
		return instancia;
	}
	
	public List<String> getMensagens() {
		return mensagens;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
		this.mensagens.add(mensagem);
		notificarObservadores();
		
	}

	@Override
	public void adicionarObservador(UsuarioBean usuarioBean) {
		this.observadores.add(usuarioBean);
	}

	@Override
	public void removerObservador(UsuarioBean usuarioBean) {
		this.observadores.remove(usuarioBean);		
	}

	@Override
	public void notificarObservadores() {
		for( Observador observador : this.observadores){
			observador.atualizarMensagem(this.mensagem);
			
		}
	}
	
	public List<Observador> getObservadores() {
		return observadores;
	}
}
<?xml version='1.0' encoding='ISO-8859-1' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"      >
    <h:head>
        <link href="#{facesContext.externalContext.requestContextPath}/estilo.css" 
              rel="stylesheet" type="text/css" />  
        <title>Chat JSF</title>

    </h:head>

    <h:body>

        <p:layout id="layout" fullPage="true" styleClass="layout" size="100">

			<p:layoutUnit id="layoutUnitUsuariosOnline" position="west">
				<h:panelGroup id="painelUsuariosOnline" styleClass="painelBorda">
                    Usuários online:
                    <h:form>
                        <h:dataTable value="#{Main.painelMensagem.observadores}" var="observadores">
                            <h:column>#{observadores}</h:column>
                        </h:dataTable>                           
                    </h:form>

			    </h:panelGroup>
			</p:layoutUnit>
			
			<p:layoutUnit id="layoutUnitChatMensagens" position="center">
		        <h:panelGroup id="painelChatMensagens">
		        
                    <h:form id="form1"> 
                        <h:outputText value="Ultima mensagem: #{Main.painelMensagem.mensagem}"/>
                        <h:dataTable value="#{Main.painelMensagem.mensagens}" var="msg">
                            <h:column>#{msg}</h:column>
                        </h:dataTable>                 
                    </h:form>
		        </h:panelGroup>
			</p:layoutUnit>
			
			<p:layoutUnit id="layoutUnitEnviarMensagens" position="south" size="100" >  
		        <h:panelGroup id="painelEnviarMensagens" >
		        
		            <h:form id="form2">
		            
		                <h:panelGrid columns="2">
		                
			                <h:column rendered="#{Main.usuarioBean.usuario.apelido == null}" >
			                    <h:outputText value="Digite o apelido"/> 
			                    <h:inputText value="#{Main.usuarioBean.usuario.apelido }" id="apelido"/>
	                            <h:commandButton value="Entrar na sala!"/>
	                            
	                        </h:column>

			                <h:column rendered="#{Main.usuarioBean.usuario.apelido != null}">    
			                
			                    <h:outputText value="#{ Main.usuarioBean.usuario.apelido }"/>                     
				                <h:inputText value="#{ Main.painelMensagem.mensagem }" id="mensagem"/>
		                       
		                        <h:commandButton value="Enviar mensagem !">
		                           <f:ajax event="click" execute=":form2:mensagem" render=":form1:" /> 
		                        </h:commandButton>
		                        
		                    </h:column>
		                    
		                </h:panelGrid>	
		                	         
		            </h:form>
		            
		        </h:panelGroup> 
	        </p:layoutUnit>  
	            
	    </p:layout>  
            
    </h:body>
</html>

Você não pode fazer isso no construtor.

Para o container injetar as dependências, ele precisa ter um objeto para injetar, e enquanto o construtor está sendo executado, você não tem um objeto ainda.

crie um outro método para fazer isso, que seja executado logo após o construtor.

Se você anotar um método com @PostConstruct, esse método será executado logo após a finalização da execução do construtor, e nele você já pode usar os atributos injetados.

Obrigado, pela ajuda Rodrigo Sasaki. Adicionei o pós-construtor e a passagem pelo parâmetro está funcionando, mas ele está duplicando os valores, estou procurando aqui o que possa ser. Você tem idéia sobre isso?

Não faço ideia :slight_smile: Nem sei o que você quis dizer com “duplicando os valores”. Tente ser mais específico.

Tudo bem, tentarei explicar. Na primeira vez que eu preencho:

<h:inputText value="#{Main.usuarioBean.usuario.apelido }" id="apelido"/>

Ele seta o valor preenchido para o UsuarioBean. Após isso o UsuarioBean será jogado como parâmetro:

public void aposConstrutor(){ painelMensagem.adicionarObservador(getUsuarioBean()); }
Fazendo isso uma única vez, ele é duplicado na listagem:

<h:form> <h:dataTable value="#{Main.painelMensagem.observadores}" var="observadores"> <h:column>#{observadores}</h:column> </h:dataTable> </h:form>

Abro o chat:

Ao preencher o apelido: