Ciao, ho deployato un altro progetto su GlassFish 4 utilizzando sempre come Ide Eclipse. Il progetto è sempre dello stesso tipo, ovvero un EJBProject che usa gli EJB 3.0. C'è da dire che il progetto, dopo averlo creato, lo converto come "JPA Project", quindi uso la funzionalità per crearmi le entità del database.
Su Eclise ottengo sempre questo errore quando tenta di fare il lookup JNDI:
Exception in thread "main" java.lang.RuntimeException: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at it.capone.service.CGestioneDomande.<init>(CGestioneDomande.java:44)
at it.capone.test.MainGestioneDomande.main(MainGestioneDomande.java:13)
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at it.capone.service.CGestioneDomande.<init>(CGestioneDomande.java:35)
... 1 more
Questo è il persistence.xml. Il dataSource lo chiamo "qaxjndi" e l'ho configurato su GlassFish, si connette verso un database, e facendo il Ping proprio verso quel database esso va a buon fine:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="QaxEJB-PU" transaction-type="JTA">
<jta-data-source>qaxjndi</jta-data-source>
<class>it.capone.entity.Domanda</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties/>
</persistence-unit>
</persistence>
Entità Domanda creata automaticamente dall'IDE:
@Entity
@NamedQuery(name="Domanda.findAll", query="SELECT d FROM Domanda d")
public class Domanda implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int iddomanda;
//Altri campi e metodi get/set dell'entità
........
........
}
Interfaccia Locale:
@Local
public interface DomandaDAOLocal {
List<Domanda> getDomande();
}
Interfaccia Remota:
@Remote
public interface DomandaDAORemote {
List<Domanda> getDomande();
}
Classe Stateless:
@Stateless
public class DomandaDAOImpl implements DomandaDAORemote, DomandaDAOLocal {
@PersistenceContext(unitName="QaxEJB-PU")
protected EntityManager em;
@Override
public List<Domanda> getDomande() {
List<Domanda> domande = em.createNamedQuery("Domanda.findAll").setMaxResults(10).getResultList();
return domande;
}
}
Classe che uso per il JNDI lookup. Come puoi vedere la stringa che uso per il lookup è quella che il server mi suggerisce in fase di deploy:
Portable JNDI names for EJB DomandaDAOImpl: [java:global/QaxEJB/DomandaDAOImpl!it.capone.businessDAO.DomandaDAORemote, java:global/QaxEJB/DomandaDAOImpl!it.capone.businessDAO.DomandaDAOLocal]
public class CGestioneDomande {
private DomandaDAORemote domandaService;
public CGestioneDomande() throws RuntimeException {
try {
if(new InitialContext().lookup("java:global/QaxEJB/DomandaDAOImpl!it.capone.businessDAO.DomandaDAORemote") instanceof DomandaDAORemote)
domandaService = (DomandaDAORemote) new InitialContext().lookup("java:global/QaxEJB/DomandaDAOImpl!it.capone.businessDAO.DomandaDAORemote");
else {
System.out.println("Instanceof non ha funzionato");
}
}
catch(NamingException ex) {
throw new RuntimeException(ex);
}
}
public List<Domanda> getDomande() {
List<Domanda> domande = domandaService.getDomande();
return domande;
}
E questo è il Main in cui testo l'applicazione:
public class MainGestioneDomande {
public static void main(String[] args) {
CGestioneDomande cgd = new CGestioneDomande();
List<Domanda> lista = cgd.getDomande();
for(Domanda d : lista) {
System.out.println("Titolo domanda: " +d.getTitolo());
}
}
Debuggando ho che nel momento in cui l'applicazione arriva a leggere la stringa di lookup, si ha l'errore e schiatta tutto, quindi il problema deve essere li in qualche modo, anche se la stringa di jndi lookup è quella che il server mi dice di usare, e lo stesso progetto su Netbeans funziona bene.