Buon pomeriggio a tutti.
Vi scrivo per chiedervi cortesemente un supporto per quanto riguarda EJB.
Ho una Enterprise Application che ha al suo interno un modulo WEB: navigando nell'applicazione WEB è possibile richiamare una Application Client che a sua volta sfrutta un EJB per le varie richieste del client.
Io ho proceduto in questo modo ma non so se è quello più corretto:
nell'ambito della Enterprise Application ho inserito tutti e 3 i moduli in oggetto quindi quello web, quello client e l'EJB.
Lato application Client uso questo metodo per richiamare l'EJB:
package applicationclient1;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.swing.JOptionPane;
import miopacchetto.NewSessionBeanRemote;
public class mioTest {
public String ViewString(){
NewSessionBeanRemote pp= lookupNewSessionBeanRemote();
if (!pp.equals(null)){
pp.testEJB();
}
return "Ciao ciao";
}
public void locWMDebug(String Testo) {
JOptionPane.showMessageDialog(null,Testo, "Test Formula", JOptionPane.INFORMATION_MESSAGE);
}
private NewSessionBeanRemote lookupNewSessionBeanRemote() {
try {
Context c = new InitialContext();
return (NewSessionBeanRemote) c.lookup("java:global/ApplServer/EJBModule1/NewSessionBean");
} catch (Exception ne) {
locWMDebug(ne.getMessage());
return null;
}
}
}
(la classe in oggetto avviamente viene richiamata dalla Main)
Ovviamente lato EJB abbiamo questo:
Classe @Remote:
package miopacchetto;
import javax.ejb.Remote;
@Remote
public interface NewSessionBeanRemote {
public void testEJB();
}
Classe @Stateful:
package miopacchetto;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import javax.ejb.Stateful;
/**
*
* @author root
*/
@Stateful
public class NewSessionBean implements NewSessionBeanRemote {
public void testEJB(){
WMDebug("Hello welcome to EJB 3.1");
}
public void WMDebug(String Testo) {
try {
FileOutputStream file = new FileOutputStream("/opt/EJB_Debug_WM.log",true);
PrintStream Output = new PrintStream(file);
Output.println(Testo);
Output.close();
file.close();
}
catch (IOException e) {}
}
}
Ora premesso che sto utilizzando GlassFish versioni 2.1 e 3 (sto facendo le prove su 2 server) io procedo con il Deploy dell'enterprise application che va a buon fine. Ora se eseguo il tutto in locale dal server, l'applicazione web richiama correttamente l'applicazione client la quale richiama correttamente l'EJB.
Se provo il tutto da un'altra macchina ho il seguente errore quando il client cerca il riferimento all'EJB:
No object to bound to name java:global/ApplServer/EJBModule1/NewSessionBean
Bene
Allora provo a configurare JINDI su glassfish utilizzando le stesse informazioni presenti nel file application-client.xml
<?xml version="1.0" encoding="UTF-8"?>
<application-client version="5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ap...n-client_5.xsd">
<display-name>ap1</display-name>
<ejb-ref>
<ejb-ref-name>NewSessionBean</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<remote>miopacchetto.NewSessionBeanRemote</remote>
</ejb-ref>
</application-client>
E quindi
JNDI Name: NewSessionBean
Resource Type: Session
Factory Class: miopacchetto.NewSessionBeanRemote
JNDI Lookup: NewSessionBean
e cambiando il codice in questo modo:
private NewSessionBeanRemote lookupNewSessionBeanRemote() {
try {
Context c = new InitialContext();
return (NewSessionBeanRemote) c.lookup("NewSessionBean");
} catch (Exception ne) {
locWMDebug(ne.getMessage());
return null;
}
}
Mi da l'errore
Can't find SerialContextProvider
Insomma qualcuno di voi potrebbe darmi una mano a capire prima di tutto se la logica è corretta e se magari sbaglio a configurare JINDI (ammesso che vada configurato)?
Grazie mille a tutti e scusate la lunghezza del messaggio

Rispondi quotando