Texto abaixo foi retirado da documentação oficial do Richfaces (user guide: richfaces_reference.pdf pag: 75)
"6.2.3. Key attributes and ways of usage
If a managed bean is declared with request scope in the configuration file with the help of
tag then the life-time of this bean instance is valid only for the current
request. Any attempts to make a reference to the bean instance after the request end will throw
in Illegal Argument Exception by the server. To avoid these kinds of Exception, component a4j:keepAlive is used to maintain the state of the whole bean object among subsequent
request.
Example:
The “beanName” attribute defines the request scope bean name you’d like to re-use. Note that
this attribute must point to a legal JSF EL expression which resolves to a managed mean instance.
For example for the above code the class definition may look like this one:
class MyClass{
...
private TestBean testBean;
// Getters and Setters for testBean.
...
}"
Porém a mensagem que eu recebo quando vou usar isso na prática é:
“According to TLD or attribute directive in tag file, attribute beanName does not accept any expression”
A documentação diz que posso usar expressão, mas na prática diz que não… Afinal posso ou não? Alguém já utilizou com expressão? Meu objetivo na verdade é manter o estado somente de um atributo do meu ManagedBean e não do ManagedBean todo…
Então cara pra mim isso não funcionou. Exemplo mais prático:
ManagedBean(está no faces-config):
[code]public class MeuBean {
public List minhaLista;
// get.. e set.. minhaLista
// métodos que manipulam o minhaLista
}[/code]
JSP:
Se executo ocorre o erro NullPointerException, aí vou no construtor e inicializo o minhaLista com um ArrayList vazio. Quando executo as requisições que populam o minhaLista e que precisam que este mantenha o estado, sempre tenho o minhaLista vazio.
O maior problema é que dessa forma ele salva todos os atributos do bean. Se eu tenho um bean com 500 atributos mas só quero manter o estado de 1 que é do tipo Character eu sou obrigado a salvar outros 499.
Por isso quero utilizar com apenas 1 atributo.
Tem como você postar uma parte do seu código (Bean e JSP), onde você disse que conseguiu utilizar ele com um atributo ?
N sei se vc ja resolveu mas utliza a biblioteca tomaHawk especificamente a propriedade saveState ela irá segurá somente uma propriedade do seu bean…
Leonardo Couto Conrado.[/quote]
Fala Leonardo !
Então, primeiramente vlw por ter respondido.
Com relação ao tomaHawk com ele consigo resolver o problema, porém queria saber como funciona o a4j:keepAlive, pois na documentação diz que posso salvar apenas um objeto. Sendo assim, por isso coloquei o topico aqui.
O keepAlive faz algo bem parecido ao q saveState faz, que é: Persisti o estato(valor) de um objeto por completo, porém, a diferença é q no saveState vc pode persisti o estado de um propriedade somente. Por exemplo:
Digamos que eu quera segurar por mais tempo o estado de minha ListaDeEmpresas, se eu utilizar o keepAlive terei que persisti todo objeto dataTableEmpresa
(na view ficaria assim: <a4j:keepAlive beanName=“dataTableEmpresa”>), ou seja, terei que alocar propriedades que não utilizarei em memória. Agora se eu utlizar o saveState persisto somente o estado da propriedade que quero que é a lista de Empresas(Na view ficaria assim: <t:saveState value="#{empresaController.dataTableEmpresa.listaProcuraDeEmpresa}"/>), ou seja, economia de memória…
[code]public class DataTableEmpresa{
private List<Empresa> listaProcuraDeEmpresa;
private Empresa copiaDeEmpresa;
private Empresa empresaSelecionada;
private boolean atualizado = false;
private boolean inativada = false;
public List<Empresa> getListaProcuraDeEmpresa() {
return listaProcuraDeEmpresa;
}
public void setListaProcuraDeEmpresa(List<Empresa> listaProcuraDeEmpresa) {
this.listaProcuraDeEmpresa = listaProcuraDeEmpresa;
}[/code]
att,
O keepAlive faz algo bem parecido ao q saveState faz…
[/quote]
Olá Leonardo.
Sim, entendo como funciona o SaveState.
Agora você chegou a ler o primeiro post que fiz ? La expliquei que o a4j:keepAlive também mantem o estado apenas de uma propriedade da minha classe (no caso do seu exemplo seria a listaProcuraDeEmpresa), assim como o saveState. Porém, se você tentar testar igual diz a documentação (que também coloquei no primeiro post a pate da documentação), ele não funciona. Por isso criei este tópico.
De uma lida no primeiro post que fiz e tente fazer um teste para ver se funciona. Aqui não funcionou !
Caso você consiga poste o código.
Tua sugestão tb n funcionou… Estou usando EJB… será q tm algo a ver com os Controllers serem Stateless?
Desculpem, sou novinha nisso ainda…
O pior, q agora estou com mais um problema… eu estou usando o bean como sessão por equanto pra poder testar as bucas etc…
O fato é : tenho uma tela de cadastro de profissional. Nessa tela, ao cadastrar endereço, tenho um botão “buscar cep” que m leva para uma outra pagina popup onde realizo minha busca. Nessa popup, outra pagina é aberta exibindo o resultado da busca. Daí fiz um bean para a busca do cep (q é o tal q precisa ser request). Mas o bean do cadastro é outro (session) e já está demais lotado!
Daí, ao selecionar o endereço desejado na lista de endereços retornados pela busca, eu seto os campos do bean de cadastro. Só q eu preciso fechar a popup e atualizar os campos da página de cadastro… deu pra entender? To apanhando
Estamos usando uma classe genérica q possui métodos para manipular os MB. Desta forma, coloquei meu bean de request na sessão quando precisei, e td funcionou