EJB 3.0 + JSF + Glassfish (Netbeans)

Galera estou fazendo um aplicativo em um trabalho da faculdade em que estou utilizando as tecnologias citadas no assunto deste tópico.
Porém estou tendo um problema para fazer a Dependency Injection de um SessionBean em minhas classes, com a annotation @EJB.

Já tentei fazer no managed bean e não vai.
Criei um classe de testes(com main) e também não funciona.

Simplesmente não acha o EJB (NameNotFoundException).

Tentei fazendo um lookup com ServiceLocator mas não estou conseguindo configurar Context. Se dexo padrão (Context ctx = new InitialContext()) ele diz que tenho que inicializar o contexto.

To perdido, alguém me ajude :frowning:

Valeu.

Tenta assim :

@EJB
private InterfaceLocal/Remota nomeSessionBeanQueImplementaAInterface

Eae Leandro.

Então cara, eu já estou fazendo isso.
Abaixo segue o código.

Interface Remota:

@Remote
public interface ClinicaVeterinaria {
   //corpo da interface
}

Interface Local:

@Local
public interface ClinicaVeterinariaLocal {
   //corpo da interface local
}

SessionBean:

@Stateless(name="ClinicaVeterinaria")
public class ClinicaVeterinariaBean implements ClinicaVeterinaria, ClinicaVeterinariaLocal {
   //corpo do sessionbean
}

Classe de teste:

public class TesteEJB {

    @EJB
    private static ClinicaVeterinaria clinicaVeterinaria;
    
    public static void main(String args[]) {
        Endereco end = new Endereco();
        end.setLogradouro("Rua");
        end.setNumero(199);
        end.setBairro("Bairro");
        end.setCidade("Cidade");
        end.setEstado("SP");
        end.setCep("100000-000");
        
        clinicaVeterinaria.incluirNovo(end);
    }
    
}

Quando eu rodo a classe da NullPointerException na chamada do método clinicaVeterinaria.incluirNovo(end); pois não retorna o EJB.

Quando eu rodo a aplicação e faço a DI pelo ManagedBean da uma javax.naming.NameNotFoundException.

Tenta trocar
@Stateless(name=“ClinicaVeterinaria”) por @Stateless(mappedName=“ClinicaVeterinaria”)
e
@EJB por @EJB(mappedName=“PersistenciaBean”)

sempre uso assim e funciona.

No seu bean Stateless… deixa apenas a notação @Stateless não precisa usar o name.

Na sua classe de TesteEJB, se essa classe é executada fora do ambiente do Glassfish então o @EJB não vai funcionar, vc pode fazer um lookup no EJB:

private static Properties getProperties() {
  //Propriedades do initial context.
  Properties props = new Properties();
  props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory");
  props.setProperty("java.naming.provider.url", "localhost:3700");
  props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming");

  return props;
}
    
public static void main(String [] args) {
  try {
    InitialContext ctx = new InitialContext(getProperties());
            
    //Quando vc faz o lookup vc passa o caminho completo da interface local ou remote.
    ClinicaVeterinaria clinica = (ClinicaVeterinaria) ctx.lookup("ClinicaVeterinaria"); 

    Endereco end = new Endereco();  
    end.setLogradouro("Rua");  
    end.setNumero(199);  
    end.setBairro("Bairro");  
    end.setCidade("Cidade");  
    end.setEstado("SP");  
    end.setCep("100000-000");  
            
    clinicaVeterinaria.incluirNovo(end); 
  } catch (NamingException e) {
    e.printStackTrace();
  }
}

Se ele não encontrar o EJB, adiciona esses jas no seu projeto (esses jars estão no pacote GLASSFISH_HOME\lib)

appserv-deployment-client.jar
appserv-ext.jar
appserv-rt.jar
javaee.jar