a4j:keepAlive porque não funciona?

15 respostas
nei.junior

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…

Aguardo e obrigado por enquanto !

15 Respostas

Marlon_Meneses

cara…
realmente na documentacao diz isso mas nao funciona e nao sei pq!!
rsrsrs

eu sempre usei assim

e funciona legal

nei.junior

Fala Marlon.

Então cara pra mim isso não funcionou. Exemplo mais prático:

ManagedBean(está no faces-config):
public class MeuBean {

     public List minhaLista;

     // get.. e set.. minhaLista
     // métodos que manipulam o minhaLista

}
JSP:
<a4j:keepAlive beanName="meuBean.minhaLista" />

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.

Grato !

Marlon_Meneses

entao passa soh o meuBean mesmo

nei.junior

Então Marlon !

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 ?

Grato !

nei.junior

Alguem tem mais alguma idéia do que pode ser ?

Grato !

leonardocoutoc

Ola Junior,

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.

nei.junior

leonardocoutoc:
Ola Junior,

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.

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.

Mas vlw pela dica.

leonardocoutoc

Olá nei.junior,

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: ), 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: ), ou seja, economia de memória...

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;
	}
att,

Leonardo Couto Conrado.

nei.junior

leonardocoutoc:
Olá nei.junior,

O keepAlive faz algo bem parecido ao q saveState faz…

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.

Vlw !

vitenho

usa a annotation em vez da tag

@KeepAlive
public class MeuBeanRequest{

}

http://www.jboss.org/index.html?module=bb&op=viewtopic&t=104989

aqui explica q o keepalive soh guarda campos ajax

flw

Javac

Comigo isso não funcionou :(

Na verdade não funcioan de nenhum dos jeitos, só em escopo de sessão. que não é o que eu quero.

:(
@KeepAlive
public class BuscarCepBean {

	@EJB
	EnderecoControllerLocal enderecoControllerLocal;

	private String nomeLogradouro;
	private List<Endereco> listaEndereco;
	private Endereco enderecoCompleto;
	private String cep;
	private Logradouro logradouro;
	private List<Logradouro> listaLogradouro;
	private String mensagem;
	private int rows = 10;
	private int scrollerPage = 1;
	private int size;
	
	public BuscarCepBean() {
		super();
		listaLogradouro = new ArrayList<Logradouro>();
	}

	public String getNomeLogradouro() {
		return nomeLogradouro;
	}

	public void setNomeLogradouro(String nomeLogradouro) {
		this.nomeLogradouro = nomeLogradouro;
	}

	public Logradouro getLogradouro() {
		return logradouro;
	}

	public void setLogradouro(Logradouro logradouro) {
		this.logradouro = logradouro;
	}

	public List<Endereco> getListaEndereco() {
		return listaEndereco;
	}

	public void setListaEndereco(List<Endereco> listaEndereco) {
		this.listaEndereco = listaEndereco;
	}

	public Endereco getEnderecoCompleto() {
		return enderecoCompleto;
	}

	public void setEnderecoCompleto(Endereco enderecoCompleto) {
		this.enderecoCompleto = enderecoCompleto;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public void setListaLogradouro(List<Logradouro> listaLogradouro) {
		this.listaLogradouro = listaLogradouro;
	}

	public List<Logradouro> getListaLogradouro() {
		return listaLogradouro;
	}

	public String getMensagem() {
		return mensagem;
	}

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

	public String buscarCep() {

		return null;

	}

	public int getScrollerPage() {
		return scrollerPage;
	}

	public void setScrollerPage(int scrollerPage) {
		this.scrollerPage = scrollerPage;
	}

	public int getSize() {
		return size;
	}

	public void setSize(int size) {
		this.size = size;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}

	public int getRows() {
		return rows;
	}
vitenho

what?

marcos1EM

Eu faço assim

@KeepAlive(ajaxOnly = true) public class SuaClasse { }

Javac

Olá, marcos1EM

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… :smiley:

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? :stuck_out_tongue: To apanhando :frowning:

Espero n ter sido mt prolixa…

Grata!!

Javac

Gente, obrigada!

Resolvi meu problema…

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 :smiley:

vlw… hasta la vista! 8)

Criado 6 de abril de 2009
Ultima resposta 13 de ago. de 2010
Respostas 15
Participantes 6