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:
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);
	}
}
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
  +- 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)
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
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();
		}
	}
}
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
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();
		}
	}
}
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
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)
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...

Une idée de la cause du problème ? D'avance merci