Lookup de EJB que não acha o bean pelo nome (para testes)

Olá pessoal, tudo bem?

Estou tentando fazer o lookup de um EJB Stateless para poder testá-lo (sim, isso é um requisito) mas não consigo encontrá-lo de jeito nenhum (nenhum endereço). Já vi num exemplo do TomEE o cara fazendo assim mas ele nao tinha interface (era a classe @Stateless direto). O que estou errando?

public interface Calculo {
      void A();
}

@Stateless
public class CalculoImpl implements Calculo {
     public void A() {
        //codigo
     }
}

No teste (o nome do projeto é currency):

 @Before
 public void lookupABean() throws NamingException {
    Calculo calculator;
    EJBContainer ejbContainer = EJBContainer.createEJBContainer();
    Object object = ejbContainer.getContext().lookup("java:global/currency/CalculoImpl");
    
    calculator = (CalculoImpl) object;
}

O erro é que ele nao consegue fazer o lookup do proxy para o meu .
java.lang.ClassCastException: com.sun.proxy.$Proxy39 cannot be cast to com.fexco.currency.ChargeCalculatorImpl
at com.app.currency.ChargeCalculatorTest.lookupABean(ChargeCalculatorTest.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

Estou usando JavaEE 7 com openejb-core e JUnit 4.11

Podem me ajudar, por favor? Nao sei mais o que fazer

Tem que ser assim:

calculator = (Calculo) object;

1 curtida

Muito obrigado! Funcionou agora! Que alívio :smiley:

1 curtida

É que você estava fazendo o cast para a implementação, isso não funciona pois é criado um proxy do objeto, você sempre deve depender somente da interface.

É verdade staroski. Eu debuguei o codigo e percebi que era um proxy.

Você parece conhecer bastante de EJB e a estrutura, onde você aprendeu/aprende isso tudo?

Trabalhando, pesquisando e lendo documentação.