Como acessar método de 'outro' Managed Bean?

1,395 views
Skip to first unread message

marqu...@gmail.com

unread,
Jan 16, 2010, 9:08:02 AM1/16/10
to javasf: JavaServer Faces Group
Colegas,

Como eu faço para, no ManagedBean1 acessar métodos de ManagedBean2?

Muito obrigado,

Marques

thiago moraes

unread,
Jan 16, 2010, 9:22:54 AM1/16/10
to jav...@googlegroups.com
no faces config vc injeta um managed bean no outro ....

aí é só chamar seu método.....

--
Você está recebendo esta mensagem porque se inscreveu no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para jav...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para javasf+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/javasf?hl=pt-BR.






--
Thiago Alves de Moraes
thiag...@gmail.com

Jose Marques Filho

unread,
Jan 16, 2010, 9:33:34 AM1/16/10
to jav...@googlegroups.com
Prezado Thiago,

Vc tem um exemplo de como ficaria o  faces config?

Muito obrigado,
public void validateContaDebito(FacesContext context, UIComponent toValidate, Object value) {  
ContabilContaVO contaDebito = null;
try {
Integer codigoReduzido = (Integer) value;
contaDebito = findByCodigoReduzido(codigoReduzido);
} catch (NoResultException e) {
String text = FacesUtils.getResourceString("validator.contaNaoCadastrada");
FacesMessage message = new FacesMessage();
            message.setDetail(text);
            message.setSummary(text);
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(message);
}
if (contaDebito instanceof ContabilContaVO) {
if (!(contaDebito.getNatureza() == ContabilContaNaturezaEnum.D)) {
String text = FacesUtils.getResourceString("validator.contaNaoDevedora");
FacesMessage message = new FacesMessage();
           message.setDetail(text);
           message.setSummary(text);
           message.setSeverity(FacesMessage.SEVERITY_ERROR);
           throw new ValidatorException(message);
}
}
}  
Marques



2010/1/16 thiago moraes <thiag...@gmail.com>

Domingos Bernardo

unread,
Jan 16, 2010, 9:37:11 AM1/16/10
to jav...@googlegroups.com
Olá, bom dia a todos,


Encontrei uma maneira de fazer da seguinte forma:

- incluir bean1 e bean2 na configuração do arquivos faces-config.xml

- o método descrito abaixo foi inserido no bean 1 que da acesso ao bean 2;


private void doPaginaPrincipal(String pagina){
          
        Bean2 bean2 = (Bean2) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("bean2");
       
        bean2.setPaginaPrincipal(pagina);       
       
    }

atenciosamente,

Domingos Bernardo Gomes Santos
Laboratório de Sensores Ópticos - LSO
Departamento de Engenharia de Energia  e Automação Elétricas - PEA / POLI - USP
www.domingosber.wordpress.com



--
Você está recebendo esta mensagem porque se inscreveu no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para jav...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para javasf+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/javasf?hl=pt-BR.






--

Rande Arievilo Moreira

unread,
Jan 16, 2010, 10:50:08 AM1/16/10
to jav...@googlegroups.com
Marques,

dá uma olhada aqui: http://balusc.blogspot.com/2006/06/communication-in-jsf.html#CommunicationBetweenManagedBeans

2010/1/16 Domingos Bernardo <domin...@gmail.com>



--
Rande Arievilo Moreira
-------------------------------------------------------
Ciência da Computação
Universidade Federal de Minas Gerais
Linux User #404468

Rafael Meireles

unread,
Jan 16, 2010, 3:55:47 PM1/16/10
to jav...@googlegroups.com
Levando em consideração que geralmente temos um managed bean por caso de uso
chamar um bean dentro de outro nao estaria criando uma dependencia entre eles?

2010/1/16 Rande Arievilo Moreira <randea...@gmail.com>



--
Atenciosamente,
--------------------------------------------
Rafael Meireles Caetano
Arquiteto Java EE
Equipe de Arquitetura CGDT
Fone: +55 85 8811-1806

Jose Marques Filho

unread,
Jan 16, 2010, 4:15:08 PM1/16/10
to jav...@googlegroups.com
Rafael,

Essa eh uma preocupação minha, porém qual o enfoque que vc daria no caso desse método ser usado em varios Managed Beans?

Sds,

Marques

2010/1/16 Rafael Meireles <rafaelm...@gmail.com>

Rafael Meireles

unread,
Jan 16, 2010, 5:02:04 PM1/16/10
to jav...@googlegroups.com
Se ele eh utilizado em varios beans entao ele eh um servico da aplicacao, seria entao elavado a tal
nivel ao inves de um managed bean.

2010/1/16 Jose Marques Filho <marqu...@gmail.com>

Walter Mourão

unread,
Jan 17, 2010, 5:24:07 AM1/17/10
to jav...@googlegroups.com
Use o "variable resolver":

...
    public Object getBean(String name) {

        return FacesContext.getCurrentInstance().
                       getApplication().getVariableResolver().
                       resolveVariable(FacesContext.getCurrentInstance(), name);

    }
...
        Bean2 bean2 = (Bean2) getBean("bean2");
...


Walter Mourão
http://waltermourao.com.br
http://arcadian.com.br
http://oriens.com.br



2010/1/16 Rafael Meireles <rafaelm...@gmail.com>

Domingos Bernardo

unread,
Jan 17, 2010, 7:34:50 AM1/17/10
to jav...@googlegroups.com
Olá, bom dia a todos,

Quando comecei a desenvolver aplicações JSF,

logo encontrei uma situação onde entendia que era necessário a comunicação entre beans.

Porém hoje, tenho consigo resolver as situações sem a necessidade de realizar a comunicação entre beans.

Uma dica acredito, é pensar em relações entre as interfaces da aplicação JSF e os beans.

Atenciosamente,


Domingos Bernardo Gomes Santos
Laboratório de Sensores Ópticos - LSO
Departamento de Engenharia de Energia  e Automação Elétricas - PEA / POLI - USP
domingo...@pea.usp.br
www.domingosber.wordpress.com


2010/1/17 Walter Mourão <walter...@gmail.com>



--

Rafael Ponte

unread,
Jan 17, 2010, 8:53:10 AM1/17/10
to jav...@googlegroups.com
Exato Domingos!

Managed beans por sua natureza são componentes que estão intimamente ligados a interface gráfica do usuário (GUI), então a comunicação entre eles, se realmente necessária, pode, na maioria dos casos, ser feita diretamente na página. Existem casos excepcionais claro, mas acredito que ainda nestes casos vaila a pena analisar com carinho o cenário.

Eu bloguei sobre o assunto algum tempo atrás, são apenas algumas sugestões e práticas que tenho me utilizado durante todo este tempo e tenho obtido bons resultados.

Abraços e boa sorte.

2010/1/17 Domingos Bernardo <domin...@gmail.com>



--
Rafael Ponte
http://www.rponte.com.br

Jose Marques Filho

unread,
Jan 17, 2010, 9:00:28 AM1/17/10
to jav...@googlegroups.com
Domingos, Rafael,

Imagine que vc tenha uma tela de cadastro e seu respectivo MB no qual tenha um  metodo que valida um determinado input. Vamos exemplicar como um codigoConta que deve atender a certos requisitos.

Esses mesmos requisitos serão usados em outras telas onde temos que validar se a conta informada atende aos ditos requisitos.

Nesse caso, como vcs fariam? Poderiam me apresentar um exemplo?

Muito obrigado,

Marques

2010/1/17 Rafael Ponte <rpo...@gmail.com>

Domingos Bernardo

unread,
Jan 17, 2010, 9:01:45 AM1/17/10
to jav...@googlegroups.com
olá a todos,

foi exatamente nesse site onde aprendi !

abraço a todos,



2010/1/17 Rafael Ponte <rpo...@gmail.com>

Domingos Bernardo

unread,
Jan 17, 2010, 9:17:13 AM1/17/10
to jav...@googlegroups.com
Olá,

Bom nesse caso,

primeiro é necessário entender como funciona o ciclo de vida de uma aplicação JSF.

porque ?

Imagina que a validação ocorre em um momento, e o submit do formulário em outro momento do ciclo de vida de uma aplicação JSF.

Desta forma, durante o ciclo de vida, é possível acionar diferentes metodos listeners,

em diversos momentos, tanto nas validações como também no submit do formulário.

Entender esse processo foi fundamental no meu aprendizado sobre JSF,

atenciosamente,


2010/1/17 Jose Marques Filho <marqu...@gmail.com>

Rafael Meireles

unread,
Jan 17, 2010, 9:25:16 AM1/17/10
to jav...@googlegroups.com
Ponte, o que vc acha sobre a comunicação entre beans?

Eu confesso que hj quando vejo um bean sendo injetado ou usado de alguma
maneira dentro de outro e tomando por base que cada bean representa um caso de uso
eu me pergunto, sera que funcionalidades de um caso de uso tem que ser utilizados em outro?
se tiver pq isto estaria em um managed bean e nao em uma classe de negocio ou servico ou qualquer outra coisa que possibilite o reuso da regra mantendo o baixo acoplamento entre os beans
ou seja entre os casos de uso(levando em consideracao um bean por UC).

Rafael Ponte

unread,
Jan 17, 2010, 10:48:00 AM1/17/10
to jav...@googlegroups.com
Meireles,

Dependendo do cenário você está certissimo. É possível deixar que a comunicação aconteça a nível de Application Layer ou Domain Layer, muitas vezes isso é realmente possível e, de fato, indicado.

Mas há cenários em que managed beans realmente precisam se comunicar, isso poderia e até deveria ocorrer a nível de Presentation Layer. Lembre-se, algumas vezes um caso de uso (ou estória) é formado por dois ou mais managed beans, ou simplesmente temos managed beans de granulidade tão fina, mas necessários para processar a GUI.

Ter um ou mais managed beans relacionados (mesmo caso de uso?) se comunicando não fere o acoplamento, pois eles estão relacionados e é coeso que esta comunicação ocorra. Se a comunicacão ocorre via EL na página ou DI no managed bean isso é outra estória.

Enfim, dependendo do caso e necessidade deixar que a comunicação ocorra a nível de camada de aplicação certamente seria o mais indicado.

2010/1/17 Rafael Meireles <rafaelm...@gmail.com>

Rafael Ponte

unread,
Jan 17, 2010, 10:50:02 AM1/17/10
to jav...@googlegroups.com
São poucas informações, e como não temos uma visibilidade maior do sistema eu só posso chutar :-)

1. Será que um validator não resolveria o problema?
2. Seguindo a dica do Rafael Meireles, essa comunicação não poderia ocorrer a nível de camada de aplicação?

2010/1/17 Jose Marques Filho <marqu...@gmail.com>
Domingos, Rafael,

Rafael Meireles

unread,
Jan 17, 2010, 12:14:09 PM1/17/10
to jav...@googlegroups.com
Hj eu utilizo o seguinte cenario:

- 1 bean por caso de uso
- seguindo o item anterior acho um acoplamento muito forte ter bean de caso de uso dependendo de outro, sendo assim fica em uma layer a parte
- no caso de um UC depender de alguma informacao de outro para nao ter bean chamando bean e nem colocar a informacao q preciso na sessao utilizo o contexto de conversao do seam, eliminando assim qualquer dependencia entre casos de uso, a nivel de bean claro.

2010/1/17 Rafael Ponte <rpo...@gmail.com>

Rafael Ponte

unread,
Jan 17, 2010, 5:49:39 PM1/17/10
to jav...@googlegroups.com
Nem sempre a comunicação entre os managed beans se deve alguma regra de negócio ou está relacionado as camadas mais baixas. Um bom exemplo seria uma página precisar abrir outra página (modal ou não) com alguns valores pré-populados :-)

Existem outros exemplos, mas este é bem comum.

2010/1/17 Rafael Meireles <rafaelm...@gmail.com>

Marcelo Gomes

unread,
Jan 18, 2010, 5:57:50 AM1/18/10
to jav...@googlegroups.com
Eu costumo injetar um bean no outro no seguinte caso:

Cliente faz login, em seguinda cliente faz uma compra.


Para este caso eu teria na primeira pagina dois beans sendo

1 - ManagedBean ClienteMB (que só tem o cliente com o get e o set
dele) (este bean tem scope de sessao)

2 - BackBean - LoginBB (que contem o metodo de validar o login e o
clienteMB fica injetado nele) (este bean tem scope de request)


Na segunda págia tenho 3 Bean sendo

1 - ManagedBean Produto (Que vai conter o produto, com o get e o set
dele - é o produto que esta sendo comprado) (este ben tem scope de
sessao)
2 - O managedBean Cliente (afina na compra tenho que saber qual
cliente fez a compra)
3 - O BackBean CompraBB (que contem o metodo de "comprar" [grava no
banco]) e os dois beans acima injetado (este tem scope de request)


É assim que constumo fazer, não cosegui ver outra solução melhor para
este caso ainda.


Abraço,
Marcelo Gomes

2010/1/17 Rafael Ponte <rpo...@gmail.com>:

Ricardo PinGuiM

unread,
Jan 18, 2010, 6:17:15 AM1/18/10
to jav...@googlegroups.com
se vc tiver a propriedade "oi" no mb2 e quiser dar um oi pra alguem usando o mb1 é soh usar o property no faces-config

ex: 
  1. <managed-bean>  
  2.     <managed-bean-name>mb1</managed-bean-name>  
  3.     <managed-bean-class>br.com.teste.controlador.mb1</managed-bean-class>  
  4.     <managed-bean-scope>session</managed-bean-scope>  
  5.     <managed-property>  
  6.         <property-name>oi</property-name>  
  7.         <property-class>br.com.teste.controlador.mb2.oi</property-class>  
  8.         <value>#{oi}</value>  
  9.     </managed-property>  
  10. </managed-bean>  

entao é soh vc declarar no mb1 uma propriedade "oi" e usar ela....

cara eu procurei o projeto que usei isso mas nao encontrei, entao pode ter uma ou outra coisa errada mas esse é um dos meios de conversa entre beans...
Reply all
Reply to author
Forward
0 new messages