IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Wildfly/JBoss Java Discussion :

ClassCastException lors de l'accès à un EJB3 depuis une servlet


Sujet :

Wildfly/JBoss Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut ClassCastException lors de l'accès à un EJB3 depuis une servlet
    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

  2. #2
    Membre éclairé Avatar de XmasRock
    Inscrit en
    Janvier 2007
    Messages
    729
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 729
    Points : 821
    Points
    821
    Par défaut
    Peux-tu decrire ton packaging.
    On dirait que tu a mis les interfaces de l'ejb dans ta war et dans ton jar ejb au lieu de les mettre dans un jar separé atteignable de ton EJB et de ta WAR.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Désolé d'avoir un peu tardé à te répondre

    Les différentes interfaces des EJB sont présentes dans le même jar que les beans en eux-mêmes. Ce jar est référencé dans le Java Build Path du projet web.

    Je n'ai pas encore essayé de mettre les interfaces dans un jar séparé. J'ai voulu tester si ça marcherait avec une version plus récente de JBoss et tout fonctionne nickel avec la version 4.2.3GA ! Je ne comprend pas cette différence de comportement

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 5
    Points : 6
    Points
    6
    Par défaut comment utiliser @EJB dans ce cas ?
    Bonsoir,

    Je débute avec EJB3, j'ai eu ce problèmpe auj. Je me pose la question pourquoi pas utiliser @EJB et comment procédér ?

    Merci

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par ronald.kooman Voir le message
    Bonsoir,

    Je débute avec EJB3, j'ai eu ce problèmpe auj. Je me pose la question pourquoi pas utiliser @EJB et comment procédér ?

    Merci
    De ce que j'ai compris, l'annotation @EJB n'est prise en charge par JBoss qu'à partir des versions 5.x.

    Quant à la manière de procéder, dans ta classe cliente, tu déclare un attribut du type de ton bean session et tu l'annotes avec @EJB, en indiquant éventuellement le nom JNDI de ton bean.

    Un petit exemple ici: http://openejb.apache.org/3.0/inject...s-example.html

Discussions similaires

  1. L' accés est refusé depuis une Iframe
    Par th0mas dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/05/2008, 13h15
  2. Réponses: 3
    Dernier message: 02/03/2008, 01h05
  3. Accès à un fichier depuis une procédure stockée
    Par greg75 dans le forum Sybase
    Réponses: 2
    Dernier message: 09/03/2007, 10h02
  4. [EJB2] Accès Interface locale depuis une classe métier.
    Par rigor dans le forum Java EE
    Réponses: 2
    Dernier message: 10/10/2006, 14h44
  5. accés a oracle depuis une autre machine
    Par tounsi dans le forum Connexions aux bases de données
    Réponses: 10
    Dernier message: 16/01/2006, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo