LookUp de Stateful session bean não funfa =/

13 respostas
Tchello

Boa tarde pessoal!

Então, tenho alguns beans no meu servidor (uso Jboss 4.2.2 e EJB3).
Esses beans são do tipo Stateless e consigo dar o lookup deles normalmente.
Gostaria muito de muda-los pra Stateful, mas ao trocar a Annotattion o lookup não funciona mais =/
O session bean é esse:

@Stateless
@Remote(PedidoCompra.class)
@RemoteBinding(jndiBinding = "PedidoCompraBean")
public class PedidoCompraBean implements PedidoCompra{
...
}

Desse jeito funciona perfeitamente quando dou um lookup assim:

Hashtable env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
            env.put(Context.PROVIDER_URL, "127.0.0.1" + ":" + "1099");
            env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");

            Context initctx = new InitialContext(env);
            pedidoCompraBean = (PedidoCompra) initctx.lookup("PedidoCompraBean");

Mas se eu trocar para Stateful o lookup nao funciona e joga um ClassCastException $Proxy (algum numero).

Ja tentei limpar o JBoss todo e reinicia-lo (nao necessariamente nessa ordem). Etc etc etc…
A sim, atualizei o Jar no cliente.

Alguem saberia me dizer ou suspeita o que esta gerando esse erro? E por que o ClassCastException?

Abraços!

13 Respostas

kikostyle

tenta

Tchello

Tentei e nada =/
Ta dando esse erro:

O tipo da Exception é um “NotContextException”.
Tem algo mais que devo configurar?!

G

Em alguns containers mesmo usando EJB3 você precisa fazer PortableRemoteObject.narrow().

No glassfish você não precisa, porém no OC4J você precisa. Veja se não é isso.

XXXX home = (XXXX) initctx.lookup("PedidoCompraBean"); PedidoCompra pedidoCompraBean = (PedidoCompra) PortableRemoteObject.narrow(home, PedidoCompra.class);

Sendo XXXX a classe do conteiner que o initctx.lookup te retornar, não lembro qual é de cabeça. Mas você pode descobrir fazendo um debug nesse método.

Tchello

Cara, tbm não foi.
Tentei até usando thread e nada!
o lookup até retorna um objeto, anexei um debuger e verifiquei o valor do objeto a cada passo e o lookup retorna o tal $Proxy94 (as vezes esse número varia).
O que posso estar fazendo errado? =(
Pra Stateless funciona perfeitamente mas Stateful nem com reza brava =(

Tchello

Mais uma pergunta: se eu não especificar o remote binding assim:

Qual era mesmo o padrão que devo montar a string no lookup?

Abraços.

Tchello

Para fins de informação do problema.
O engraçado é notar que se eu colocar dessa forma:

Ele da um classCastException

Mas se eu colocar dessa forma:

Ele da um NotContextException =(

G

Tchello, da forma que te falei não tem como dar erro. Infelizmente não tenho jboss aqui para te passar certinho como fazer.

Mas enfim, faça isso aqui:

E me diga o que retornou. No OC4J ele me retornou uma interface proprietária do OC4J que extende EJBHome. Assim foi super simples fazer o create. Não entendo o porque disso, já que estamos no EJB3, e o EJBHome.create() deveria ser implicito pelo container.

Tchello

Gracia, aquele sout ali ta retornando isso:

Esquisito, não?

Suspeito que eu tenha feito errado aquele narrow que sugeriu, ainda não entendi exatamente o que substituir pelo XXX seria um EJBHome? mas não tenho isso em EJB3, terei que cria-lo?
Na dúvida coloquei um Object.

Abraços.

Tchello

Baseado naquela sugestão do narrow e no post anterior tentei assim:

Deu na mesma =/
Desculpem-me pela encheção, é que isso ta me quebrando a cabeça =/

Abraços.

G

Tchello, será que você não fez algo errado? Criei um projeto bem rápido aqui para você testar. Aqui rodou tudo direitinho usando EJB remoto e Stateful.

Interface do EJB

@Remote
public interface EchoService {

    String echo();
}

Implementação:

@Stateful
@Remote(EchoService.class)
@RemoteBinding(jndiBinding = "EchoService")
public class EchoServiceBean
    implements EchoService {

    @Override
    public String echo() {
        return new Date().toString();
    }
}

Classe de teste

public class ServiceTesting {

    @SuppressWarnings("unchecked")
    public static void main(String[] args)
        throws Exception {
        Hashtable env = new Hashtable();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        env.put(Context.PROVIDER_URL, "127.0.0.1:1099");
        env.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");

        Context ctx = new InitialContext(env);
        EchoService echoService = (EchoService) ctx.lookup("EchoService");

        System.out.println(echoService.echo());
    }
}

E por final rodando o método de teste resulta em:

Tue Sep 29 11:02:03 BRT 2009
G

Ahhh, mas peraí… você está usando Jboss 4.2.2, é? Não é essa versão do Jboss que possui um pseudo-suporte a EJB3? Você pode atualizar para a versão 5 ou tem que usar a 4.2.x?

Tchello

Garcia, ta identico.
Temos até outros projetos aqui que usando Stateful beans e funcionam dessa forma, mas esse não quer de jeito nenhum =/
Esses outros rodam no JBoss 4.0.4 e eu to usando o 4.2.2 e nem há chances de muda-lo =/
Até gostaria muito de usar JBoss 5.1 mas tem um outro pacote que não sobe nele de jeito nenhum (precisa mudar um monte de xml).

Mais sugestões?

Tchello

Exato…
To baixando o 4.2.3 e ver se funciona.
Se for o caso verificarei se funciona com o 4.0.4.
É que com o 5 eu teria que adaptar uns pacotes mto antigos e eu nem sei por onde começar. Tem dicas? fiquei um dia inteiro pesquisando e fazendo testes e nem por reza brava o ear subia no Jboss 5.

Abraços!

Criado 28 de setembro de 2009
Ultima resposta 29 de set. de 2009
Respostas 13
Participantes 3