Bonjour,
cela fait maintenant une bonne semaine que je parcours le net pour trouver une solution a mon problème sans réel succès. Cependant, je ne suis pas un pro de jboss et peut être que je ne cherche pas là où il faudrait.
Mon projet est constitué d'EJB avec Spring déployé dans un serveur JBoss.
Lorsque je démarre mon projet JBoss et que je déploie mon application, tout fonctionne bien, je peux accéder a mes EJB
Si je redéploie mon EAR (même sans changer une ligne de code), JBoss décharge (undeploy) l'application et la recharge (deploy) a nouveau.
Cependant, j'obtiens toujours une erreur ClassCastException ensuite lors de l'accès a mon EAR (methode getBean) :
java.lang.ClassCastException: $Proxy102 incompatible with mon.projet.XXXXInterne
On dirais donc que le "undeploy" de JBoss garde la référence de l'ancienne classe dans un ClassLoader. Comment supprimer ou vider ce cache ? (Je cherche a faire fonctionner un environnement de développement, pas de production)
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 2010-01-11 14:17:12,603 DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] Returning cached instance of singleton bean 'DelegateXXXX' 2010-01-11 14:17:12,611 ERROR [org.jboss.ejb.plugins.LogInterceptor] EJBException in method: public abstract mon.projet.XXXXServiceRemote mon.projet.XXXXServiceHome.create() throws javax.ejb.CreateException,java.rmi.RemoteException, causedBy: javax.ejb.EJBException: java.lang.ClassCastException: $Proxy102 incompatible with mon.projet.XXXXInterne at org.jboss.ejb.StatelessSessionEnterpriseContext.<init>(StatelessSessionEnterpriseContext.java:85) at org.jboss.ejb.plugins.StatelessSessionInstancePool.create(StatelessSessionInstancePool.java:49) at org.jboss.ejb.plugins.AbstractInstancePool.get(AbstractInstancePool.java:184) at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invokeHome(StatelessSessionInstanceInterceptor.java:95) at org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(SecurityInterceptor.java:145) at org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogInterceptor.java:132) at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invokeHome(ProxyFactoryFinderInterceptor.java:107) at org.jboss.ejb.SessionContainer.internalInvokeHome(SessionContainer.java:637) at org.jboss.ejb.Container.invoke(Container.java:981) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:615) at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155) at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94) at org.jboss.mx.server.Invocation.invoke(Invocation.java:86) at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264) at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659) at org.jboss.invocation.jrmp.server.JRMPInvoker$MBeanServerAction.invoke(JRMPInvoker.java:818) at org.jboss.invocation.jrmp.server.JRMPInvoker.invoke(JRMPInvoker.java:419) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:615) at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:309) at sun.rmi.transport.Transport$1.run(Transport.java:168) at java.security.AccessController.doPrivileged(AccessController.java:275) at sun.rmi.transport.Transport.serviceCall(Transport.java:164) at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:506) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.handleRequest(TCPTransport.java:838) at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:912) at java.lang.Thread.run(Thread.java:801) Caused by: java.lang.ClassCastException: $Proxy102 incompatible with mon.projet.XXXXInterne at mon.projet.XXXXBean.onEjbCreate(XXXXBean.java:66) at mon.projet.EJBServiceBase.ejbCreate(EJBServiceBase.java:103) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:615) at org.jboss.ejb.StatelessSessionEnterpriseContext.<init>(StatelessSessionEnterpriseContext.java:78) ... 31 more
J'ai également un deuxieme probleme :
actuellement mon projet est déployé sous forme d'un EAR (ou d'un dossier EAR, ca donne le meme résultat)
Idéalement, je voudrais pouvoir remplacer a chaud l'implémentation du code de certains EJB sans avoir a eteindre/redémarrer le serveur JBoss, voir meme sans avoir a faire les operation undeploy/reploy sur tout les EJB, mais uniquement l'EJB qui m'interesse (car il y a environ 100 EJB...)
Or actuellement, le seul moyen que j'ai trouvé pour que JBoss recharge mon projet, c'est la modification de META-INF/application.xml, ce qui a pour effet de recharger tout les EJBs.
Peut on faire mieux ?
Les détails techniques :
JBoss 4.2.2.GA
EJB 2.1
Spring 2.5
Merci d'avance ;o)
Partager