Bonjour à tous,
Afin de découvrir les EJB3, je me suis lancé dans un petit développement perso. J'ai d'abord suivi le tutorial d'EclipseTotal (http://www.eclipsetotale.com/article...c_Eclipse.html) et ai récupéré le serveur d'applications JBoss 4.0.5 qui y proposé, que j'ai installé avec le support des EJB3.
Dans Eclipse (Ganymède, v.3.4.0), j'ai créé plusieurs projets:
- un projet Test_EJB de type EJB Project destiné à contenir mes sessions et entity beans
- un projet Test_web de type Dynamic Web Project destiné à manipuler les sessions beans du projet ci-dessus. Dans les préférences, pour l'onglet Projects de la section Java Build Path, j'ai bien référencé le projet Test_EJB
- un projet Test_EAR de type Enterprise Application Project qui référence les 2 projets précédents en tant que modules
- un projet Java tout bête Test_client pour tester mes session beans sans avoir à passer par la webapp
Dans la vue Servers, j'ai configuré mon JBoss et y ai ajouté le projet Test_EAR.
Dans mon projet Test_EJB, j'ai créé le session bean suivant:
Après vérification dans la console JMX de JBoss, le bean est déployé et j'obtiens les informations suivantes:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 @Remote public interface Test { void test(final String param); } @Stateless public class TestBean implements Test { @Override public final void test(final String param) { System.out.println("param is " + param); } }
Tout marche correctement quand je fais le test via la classe suivante, présente dans le projet Test_client:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 +- Test_EAR (class: org.jnp.interfaces.NamingContext) | +- TestBean (class: org.jnp.interfaces.NamingContext) | | +- remote (proxy: $Proxy111 implements interface reno.business.Test,interface org.jboss.ejb3.JBossProxy,interface javax.ejb.EJBObject)
Dans mon projet Test_web, j'ai créé la servlet suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public class Client { public static final void main(final String[] args) { try { final Hashtable<String, String> params = new Hashtable<String, String>(); params.put(INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); params.put(URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); params.put(PROVIDER_URL, "jnp://127.0.0.1:1099"); final Context context = new InitialContext(params); final Test test = (Test) context.lookup( "Test_EAR/TestBean/remote"); System.out.println(test.test("param")); } catch(final NamingException nex) { nex.printStackTrace(); } } }
Malheureusement, j'obtiens l'erreur suivante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class TestServlet extends HttpServlet { // ... protected final void doPost(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { try { final Hashtable<String, String> params = new Hashtable<String, String>(); params.put(INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); params.put(URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces"); params.put(PROVIDER_URL, "jnp://127.0.0.1:1099"); final Context context = new InitialContext(params); final Test test = (Test) context.lookup( "Test_EAR/TestBean/remote"); response.getWriter().println(test.test("param")); } catch(final NamingException nex) { nex.printStackTrace(); } } }
L'objet récupéré par le lookup est de type $Proxy84. Le problème est le même quand je déclare mon bean en tant que local, ça fonctionne avec ma classe Client, ça pète avec la servlet...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 15:10:00,466 ERROR [[TestServlet]] Servlet.service() for servlet TestServlet threw exception java.lang.ClassCastException: $Proxy84 cannot be cast to reno.business.Test at reno.web.TestServlet.doPost(TestServlet.java:60) at reno.web.TestServlet.doGet(TestServlet.java:40) at javax.servlet.http.HttpServlet.service(HttpServlet.java:697) at javax.servlet.http.HttpServlet.service(HttpServlet.java:810) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:175) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.jboss.web.tomcat.tc5.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:156) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:619)
Une idée de la cause du problème ? D'avance merci
Partager