Stateful não esta mantendo estado

5 respostas
A

blz galera?

Olha eu tenho um EJB stateless aqui e tudo esta funcionando. So que eu precisei que ele mantesse o estado dele entao a unica coisa que eu fiz foi mudar a anotação para @Stateful. Não deveria funcionar normalmente mantendo o estado? E o curioso é que ele não mantem o estado, mas funciona como um @Stateless.

Se alguam puder dar um dica ja agradeço!
abrços…

5 Respostas

renanreismartins

poste seu bean

/*edit
nao esqueça de anotar um metodo com a anotaçao @Remove para que o bean seja destruido apos terminar todas as operaçoes
*/

abrassssss

A
Esta assim:
package br.com.empresa.gestaocatalogos.service;

import java.util.List;

import javax.ejb.Local;

import br.com.empresa.gestaocatalogos.domain.AtributosCatalogo;

@Local
public interface AtributosCatalogoService {

	public AtributosCatalogo save(AtributosCatalogo atributosCatalogo);
	public List<AtributosCatalogo> find(AtributosCatalogo atributosCatalogo);
	public void delete(AtributosCatalogo atributosCatalogo);
	
}
package br.com.empresa.gestaocatalogos.service.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateful;
import javax.ejb.Stateless;

import br.com.empresa.gestaocatalogos.domain.AtributosCatalogo;
import br.com.empresa.gestaocatalogos.service.AtributosCatalogoService;
//@Stateless
@Stateful
public class AtributosCatalogoServiceImpl implements AtributosCatalogoService {

	
	private List<AtributosCatalogo> atributosCatalogoList = new ArrayList<AtributosCatalogo>();
	
	@Override
	public AtributosCatalogo save(AtributosCatalogo atributosCatalogo) {
		atributosCatalogoList.add(atributosCatalogo);
		return atributosCatalogo;
	}

	@Override
	public List<AtributosCatalogo> find(AtributosCatalogo atributosCatalogo) {
		return atributosCatalogoList;
	}

	@Override
	public void delete(AtributosCatalogo atributosCatalogo) {
		if(atributosCatalogoList.contains(atributosCatalogo)){
			atributosCatalogoList.remove(atributosCatalogo);
		}
	}
}
renanreismartins esse metodo nao influencia nessa minha necessidade agora, ou sim? Mas de qualquer forma vou coloca-lo. Valeu!
pdioniziofilho

pergunta tosca mas que geralmente perdemos algum tempo com isso.

Voce tem certeza que fez o deploy já com esse .class correto?

Na dúvida baixe o appServer, limpe as pastas temps, faça o deploy novamente e teste.

Parece besteira, mas já perdi um belo tempo na vida com isso, e com cache de browser. KKKK

E o mais importante!

Talvez seu stateful ta sim guardando o estado, so que voce está fazendo varios lookups e está obtendo cada vez uma nova referencia para outro EJB.

Um EJB stateful para trabalhar como tal voce precisa MANTER (PRESERVAR) a referencia do primeiro lookup! Com essa referencia voce faz todas chamadas para outros metodos.

Se fizer outro lookup, ja era o estado!

Tchello

Então, já houve aqui uma discução semelhante, leia:

http://www.guj.com.br/posts/list/145058.java#790955

Seguinte, embora o bean seja stateful você deve manter uma referência a ele, senão a cada lookup o conteiner pode executar em uma instância diferente.
No caso de stateless mesmo se você manter a referência você pode executar em uma instância diferente, o que é imprevisível.

Pra manter a referência em web uma solução seria guardar essa instância em sessão.

Espero tê-lo ajudado.

dev.rafael

Se você estiver usando JSF como framework web eu aconselho o uso de um SessionScoped ManagedBean.
Assim você evita de lidar com a API de Servlets e ainda consegue acessar o seu SFSB de outros beans
de mode bem simples através das Managed Properties.

PS.: lembre-se de chamar o método @Remove do seu SFSB no @PostDestroy do bean de Sessão que
mantém a referência à ele. :wink:

Criado 23 de fevereiro de 2010
Ultima resposta 1 de mar. de 2010
Respostas 5
Participantes 5