Pelo que eu entendi até agora sobre ejbs, quando um Session Bean Stateful existe além do tempo limite imposto pelo container, ele é passivado. Mas antes da propriamente dita passivação, é invocado o método ejbPassivate(). Minha dúvida é a seguinte:
Digamos que o meu Session Bean tenha um atributo não serializável e mesmo assim eu quero que o meu bean seja stateful. Teria como eu dizer pro container: “Olha aqui container, eu sei que aquele atributo wyxz não é serializável ,mas eu tenho esta rotina aqui que tras uma forma serializável dele. Então eu peço que você(container) guarde esta forma, e não a forma que esta declarada no Bean”
olha, o que vc pode estar fazendo é declarando o atributo como transiente, só que ae ele não vai ser serializado…
agora o que vc está querendo(até onde eu sei) naum tem jeito naum…
S
Samuel_PessorrussoPJ
não sei se entendia a sua pergunta, mas ai vai…
no ejbPassivate() você seta o atributo para null e no ejbActivate() reinstancie ele.
D
darkseidPJ
Qual é o seu atributo q nao eh serializavel!? Se for uma classe definida por vc, basta implementar a interface serializable, é tão simples… hehehe
caso seja um tipo q nao foi definido por vc e vc nao tem acesso ao fonte, é só extender este tipo e implementar a interface :okok:
Agora, se for um tipo primitivo, basta usar o wrapper dele…
Acho q vale mais a pena usar uma dessas soluções do q ficar tentando “enganar” o container
S
Samuel_PessorrussoPJ
O problema é quando o seu tipo é uma Connection. Ai não tem jeito, você precisa setar o atributo como null e no ejbActivate() obter novamente a conexão.
D
darkseidPJ
Usar connection dentro de um Stateful!? Bom, eu nunca usei stateful, mas pra q q eu iria precisar de uma connection dentro dele!?
S
Samuel_PessorrussoPJ
eu sei… concordo com você. Só estava citando um exemplo.
D
darkseidPJ
Ah… heheh blza… :okok:
C
clone_zealotPJ
Após tanto tempo de ter postado este tópico, eu digo o que no fim das contas eu fiz.
Crie mais uma camada no meu Bean. Agora não é mais o objeto que tem os caras não serializaveis que implementa SessionBean, tem um outro cara que implementa SessionBean e delega todas as chamadas para uma instancia do objeto com os caras "inserializaveis".
Assim, quando é invocado o ejbPassivate, eu pego todos os atributos do objeto por reflexão, e "serializo" cada um como eu quero.
É +/- assim:
publicclassBeanInserializavel{publicObjetoInserializavelxpto.....publicvoidxpto(){...................}}publicclassVerdadeiroBeanimplementsSessionBean{publicHashMapmapa;publictransientBeanInserializavelinstancia;publicvoidxpto(){instancia.xpto();}publicvoidejbPassivate(){//Pego cada atributo de instancia//e coloco ele no HashMap}publicvoidejbActivate(){//Pego cada objeto do HashMap//ele coloco eles no seu devido lugar}}
S
Samuel_PessorrussoPJ
Tome cuidado pois pela especificação do EJB, o container não é obrigado a guardar os valores de variáveis transient após o ejbPassivate(), isto vai afetar a portabilidade do seu código.