Paasagens de Objetos entre Beans JSF 2.0

1,931 views
Skip to first unread message

Torquato Neto

unread,
Feb 14, 2011, 5:40:56 PM2/14/11
to javasf: JavaServer Faces Group
Pessoal,

Estou com uma dúvida e não estou percebendo o por que não está
funcionando. Minha intenção é passar alguns objetos de um Bean para
outro, dando um forward e colocando os objetos no request.

Bem, tenho um Bean "A" que é @ViewScoped e um Bean "B" que é
@RequestScoped.

O Bean "A" representa um formulário, onde se preenche algumas
informações e ao submeter, essas informações são salvas e é
redirecionado para uma outra pagina que tem o Bean "B", que é um
template de um Boleto bancário.

O que acontece é que no método do action do botão eu persisto as
informações e coloco um objeto no RequestMap, ex:

FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put("chave-
do-meu-objeto", meuObjeto);

e logo em seguida eu retorno a string "boleto/boleto-pagfacil" para ir
para a pagina "boleto/boleto-pagfacil.xhtml". Como eu não tou colando
o "?faces-redirect=true", o default é forward né ??

Bem e no bean "B", no construtor dele eu pego o objeto da seguinte
maneira:

FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get("chave-
do-meu-objeto");

O problema é que sempre vem "null", se eu colocar no SessionMap
funciona, mas no request não. Porque ?? num dou dando um forward ??

Tentei retornar "boleto/boleto-pagfacil?faces-redirect=false" para
garantir o forward, mas o comportamento é o mesmo, sempre "null".


Se alguém puder ajudar... Valeu pessoal



Torquato Neto

unread,
Feb 14, 2011, 11:24:13 PM2/14/11
to javasf: JavaServer Faces Group
Pessoal, encontrei uma solução.

Eu pensava que ao fazer:

FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put( "chave-
do-meu-objeto", meuObjeto);

Seria a mesma coisa que :
((ServletRequest)
FacesContext.getCurrentInstance().getExternalContext().getRequest()).setAttribute("chave-
do-meu-objeto", meuObjeto);

mas não é, então se vc fizer dessa segunda maneira, vai funcionar. ai
no local onde foi feito o forward, é só pegar normalmente:

FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get( "chave-
do-meu-objeto");

:)

Depois disso ocorreu um outro problema no forward. Eu estava
retornando a string "boleto/boleto-pagfacil" para jsf fazer a
navegação implicita, porém não aparecia nada na pagina. Debugando, via
que a requisição estava sendo encaminhada corretamente, mas na pagina
não aparecia nada.

Ai percebi que estava utilizando o "p:commandButton" com ajax
( commandButton do PrimeFaces ), ai retirei o ajax (ajax="false") e
ficou redirecionando normalmente. Não entendi o por que de não fazer
forward com o botão com ajax, se alguém souber a explicação, fala
ai...

Valeu....

Rafael Ponte

unread,
Feb 21, 2011, 1:58:37 PM2/21/11
to jav...@googlegroups.com, Torquato Neto
Torquato, tudo bom?

Na verdade o FacesContext.getCurrentInstance().getExternalContext().getRequestMap() é o mesmo map de atributos do escopo resquest. Ele nada mais é que uma abstração da API Servlet. Então as duas instruções citadas por você deveriam em teoria se comportar do mesmo modo.

No mais, aconselho-te a evitar o uso da API do faces sempre que possível por ser bem verbosa (pra não dizer feia!) e dificultar os testes unitários nos managed beans. O que você poderia fazer é utilizar DI do próprio framework para injetar a propriedade que você deseja no managed bean "B". Você pode fazer isso através do faces-config.xml (no velho estilo jsf1.2) ou através da anotação @ManagedProprety (estilo jsf2).

:-)

2011/2/15 Torquato Neto <torqu...@gmail.com>
--
Você recebeu esta mensagem por que é membro do  Javasf
http://groups.google.com/group/javasf

Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



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

Torquato Neto

unread,
Feb 21, 2011, 2:53:50 PM2/21/11
to javasf: JavaServer Faces Group
Fala Rafael,

Rapaz, tou vendo que é bom evitar a api do faces mesmo... com relação
ao DI, como é que do bean "A"
eu iria injetar as informações no bean "B"?

Tipo, meus managedBeans não são gerenciados pelo spring, como eu iria
buscar a instância do bean "B", para injetar esses meus objetos?

Lembrando que o bean "B" é do escopo de request.

O principal objetivo é evitar colocar as coisas na sessão e conseguir
enviar objetos entre os managedBeans.

:)

On Feb 21, 3:58 pm, Rafael Ponte <rpo...@gmail.com> wrote:
> Torquato, tudo bom?
>
> Na verdade o
> FacesContext.getCurrentInstance().getExternalContext().getRequestMap() é o
> mesmo map de atributos do escopo resquest. Ele nada mais é que uma abstração
> da API Servlet. Então as duas instruções citadas por você deveriam *em
> teoria* se comportar do mesmo modo.
>
> No mais, aconselho-te a evitar o uso da API do faces sempre que possível por
> ser bem verbosa (pra não dizer feia!) e dificultar os testes unitários nos
> managed beans. O que você poderia fazer é utilizar DI do próprio framework
> para injetar a propriedade que você deseja no managed bean "B". Você pode
> fazer isso através do faces-config.xml (no velho estilo jsf1.2) ou através
> da anotação @ManagedProprety (estilo jsf2).
>
> :-)
>
> 2011/2/15 Torquato Neto <torquat...@gmail.com>
>
>
>
>
>
>
>
>
>
> > Pessoal, encontrei uma solução.
>
> > Eu pensava que ao fazer:
>
> > FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put(
> > "chave-
> > do-meu-objeto", meuObjeto);
>
> > Seria a mesma coisa que :
> > ((ServletRequest)
>
> > FacesContext.getCurrentInstance().getExternalContext().getRequest()).setAtt ribute("chave-

Rafael Ponte

unread,
Feb 21, 2011, 3:02:56 PM2/21/11
to jav...@googlegroups.com, Torquato Neto
Oi Torquato,

Digamos que você jogou um objeto em request numa action do bean A e quer obte-la no bean B (assim como você exemplificou no primeiro e-mail). Utilizando as anotações do JSF2.0 você pode fazer algo como:

public class BeanB {

    @ManagedProperty(value="#{chave_do_objeto_em_request}")
    private String objeto;

}

Repare que o valor da anotação pode ser qualquer expression-language. Logo, você pode facilmente injetar um managed bean dentro do outro.

2011/2/21 Torquato Neto <torqu...@gmail.com>
Reply all
Reply to author
Forward
0 new messages