a4j:keepAlive porque não funciona?

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 !

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

eu sempre usei assim

e funciona legal

Fala Marlon.

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.

Grato !

entao passa soh o meuBean mesmo

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 !

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

Grato !

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.

[quote=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.[/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.

Mas vlw pela dica.

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

Leonardo Couto Conrado.

[quote=leonardocoutoc]Olá nei.junior,

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.

Vlw !

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

Comigo isso não funcionou :frowning:

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

:frowning:

[code]@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;
}[/code]

what?

Eu faço assim

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

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!!

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)