Pegar objeto de um managedBean em outro managedBean

6 respostas
A

Fala galera, blz??

Seguinte, to com uma baita dificuldade pra conseguir pegar um objeto de um bean em outro bean!

Tenho os seguintes beans:

@Name( "cotacaoCotizadorBean" )
@Scope( ScopeType.CONVERSATION )
public class CotacaoCotizadorBean extends BaseBean implements Serializable
         private	VersaoCotacaoCotizador          vCota ;
         public String cmdAvancar() {
		try {
			fgMostraTabSubgrupo = true ;
			fgMostraTabCotacoes = false ;
			//cotacao.setCdCotacao( 45872L );
			cotacao.setPlanoCotacao( planoService.recuperarPorId( cotacao.getPlanoCotacao( ).getId( )))  ;
			if( tipoSeguro )
			{
				cotacao.setTipoSeguro( "N" ) ;
			}else
			{
				cotacao.setTipoSeguro( "T" ) ;
			}
			cotacao.setCorretorCotacao( corretorSelecionado ) ;
			cotacao.setCepEstipulante( CEP.toString( ) ) ;
			if( cosseguro )
			{
				cotacao.setIcCosseguro( "S" ) ;
			}else
			{
				cotacao.setIcCosseguro( "N" ) ;
			}
			if( excedente )
			{
				cotacao.setIcExcedenteTecnico( "S" ) ;
			}else
			{
				cotacao.setIcExcedenteTecnico( "N" ) ;
			}
			cotacao.setCdRamoAtividadeEstipulante( "T1" ) ;
			cotacao.setCanalOrigem( canalOrigem ) ;
			//cotacaoCotizadorService.salvar( cotacao, usuarioLogado ) ;
			
			VersaoCorretagemCotizador vCorr = new VersaoCorretagemCotizador( ) ;
			vCorr.setTsVersao( Calendar.getInstance( ).getTime( ) ) ;
			//versaoCorretagemService.salvar( vCorr, usuarioLogado ) ;
			
			VersaoCadastralCotizador vCad = new VersaoCadastralCotizador( );
			vCad.setDtVersao( Calendar.getInstance( ).getTime( ) ) ;
			//versaoCadastralService.salvar( vCad, usuarioLogado ) ;
			
			VersaoComercialCotizador vCom = new VersaoComercialCotizador ( ) ;
			vCom.setTsVersao( Calendar.getInstance( ).getTime( ) ) ;
			vCom.setVersaoCadastral( vCad ) ;
			vCom.setVersaoCorretagem( vCorr ) ;
			//versaoComercialService.salvar( vCom, usuarioLogado ) ;
			 
			VersaoTecnicaCotizador vTec = new VersaoTecnicaCotizador( ) ;
			vTec.setTsVersao( Calendar.getInstance( ).getTime( ) ) ; 
			//versaoTecnicaService.salvar( vTec, usuarioLogado ) ;
			
			vCota = new VersaoCotacaoCotizador( ) ;
			vCota.setTsVersao( Calendar.getInstance( ).getTime( ) ) ;
			vCota.setVersaoComercial( vCom ) ;
			vCota.setVersaoTecnica( vTec ) ;
			vCota.setCotacao( cotacao ) ;
			//versaoCotacaoService.salvar( vCota, usuarioLogado ) ;
			
                        //Eu consegui fazer dessa maneira, mas sei q deve dar pra fazer de uma forma menos onerosa
			HttpSession session = (HttpSession)FacesContext.getCurrentInstance( ).getExternalContext( ).getSession( false ) ; 
			session.setAttribute( "vCadastral", vCad);
			
			setCurrentTabSheet(TAB_SUBGRUPO);
			return PAGE_COTACAO_DADOS_CADASTRAIS;

		} catch (MapfreValidacaoException v) {
			facesMessages.addFromResourceBundle(Severity.ERROR, v.getMessage());
		} catch (Exception e) {

			log.error(e.getMessage(), e);
		}
		return null;
	}
@Name( "cotacaoTabSubgrupoBean" )
@Scope( ScopeType.CONVERSATION )
public class CotacaoTabSubgrupoBean extends BaseBean implements Serializable
{

          private VersaoCadastralCotizador v ;
          public void gravarSubgrupo( )
	{
		if ( dados.size( ) == 0 )
		{
                        //aqui a forma que eu pego o objeto setado na session no outro bean
			HttpSession session = (HttpSession)FacesContext.getCurrentInstance( ).getExternalContext( ).getSession( false ) ;
			v = (VersaoCadastralCotizador)session.getAttribute( "vCadastral");
			FacesContext.getCurrentInstance( ).addMessage( "Mensagem", new FacesMessage( "Adicione ao menos um subgrupo para cadastrar!" ) ) ;
			// MensagemUtil.addInfo("Adicione ao menos um subgrupo para cadastrar!");
		}
		else
		{
			fgSubgrupoGravado = true ;
		}
		dados = new ArrayList<SubgrupoCotizador>( ) ;
	}

Entao galera eu preciso conseguir pegar ou uma instancia do bean CotacaoCotizador ou conseguir pegar o objeto versaoCadastral.

Como vocês podem ver pelas anotações estou usando seam. Li que com o seam é muito fácil, mas não to conseguindo!!!

Desde já agradeço a ajuda de todos!

6 Respostas

C

String valueBinding = "#{" + beanOfSession + "}"; FacesContext ctx = (FacesContext) FacesContext.getCurrentInstance(); return (TabController) ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(), valueBinding, TabController.class).getValue(ctx.getELContext());

esse codigo é a mesma coisa que #{testeCont} no seu xhtml so que pelo java ai pega o valor o bean, construindo na mao a expresao de linguagem

A

CristianPalmaSola10:
String valueBinding = "#{" + beanOfSession + "}"; FacesContext ctx = (FacesContext) FacesContext.getCurrentInstance(); return (TabController) ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(), valueBinding, TabController.class).getValue(ctx.getELContext());

esse codigo é a mesma coisa que #{testeCont} no seu xhtml so que pelo java ai pega o valor o bean, construindo na mao a expresao de linguagem

Cara, deixa eu te perguntar, pra implementar isso meu bean não teria q ter o scopo de session???

Outra coisa o eu li e reli seu código mas não consegui entender mto bem!!! teria como explicar???

Obrigado por responder!

K

faz assim no bean que vc quer injetar

@ManagedProperty(value = "#{aluno}")  
private Aluno aluno;
C

Nao sei testa ai para ver se funciona com bens que naum tem escopo de sessao

//crio um string para usar na criacao da expresa de lingugem a string é algo assim #{meuBean}
String valueBinding = "#{" + beanOfSession + "}";  
//nada de mais so pego o facescontext
        FacesContext ctx = (FacesContext) FacesContext.getCurrentInstance();  
//usando o facescontext para pegar a application e expressionfactory e acessar o metodo createValueExpression para ele eu passa o el context, a expresao em srtring montada no começo do metodo e o tipo da classe que espero como retorno, quando faço getValue passando novamente o el context --&gt; expression language context, ele faz a magica dele e me retorna o valor do bean
        return (TabController) ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(), valueBinding, TabController.class).getValue(ctx.getELContext());

na verda de isso é muito simples…

A

Nao sei testa ai para ver se funciona com bens que naum tem escopo de sessao

//crio um string para usar na criacao da expresa de lingugem a string é algo assim #{meuBean}
String valueBinding = "#{" + beanOfSession + "}";  
//nada de mais so pego o facescontext
        FacesContext ctx = (FacesContext) FacesContext.getCurrentInstance();  
//usando o facescontext para pegar a application e expressionfactory e acessar o metodo createValueExpression para ele eu passa o el context, a expresao em srtring montada no começo do metodo e o tipo da classe que espero como retorno, quando faço getValue passando novamente o el context --&gt; expression language context, ele faz a magica dele e me retorna o valor do bean
        return (TabController) ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(), valueBinding, TabController.class).getValue(ctx.getELContext());

na verda de isso é muito simples…

Certo axo q entendi!!!

Só mais uma dúvida: essa parte eu crio em algum metodo no bean A ou no bean B??

supondo que eu quero pegar o bean A dentro do bean B!!!

Obrigado mais uma vez!

C

se voce esta no bean A e quer pegar o B voce tem criar o metodo no bean é claro. bem obvio isso…

Criado 28 de fevereiro de 2013
Ultima resposta 1 de mar. de 2013
Respostas 6
Participantes 3