Class A cannot be cast to class A

Bonjour,
[Platform]
Status=OK
Version=4.0.P24
BuiltOn=2020-04-02 19:06 (revision 40b5a93964a5371a2b394d345f457792bdbe9c91)
Encoding=UTF-8
EndpointIP=172.17.0.8
EndpointURL=http://e769872e509a:8080
TimeZone=Europe/Paris
SystemDate=2020-04-24 10:42:42

[Application]
ApplicationVersion=0.16 dev
ContextPath=
ContextURL=https://re7.rfs.re7.aws.renault.com
ActiveSessions=2
TotalUsers=13
EnabledUsers=11

J’ai très souvent cette erreur quand j’essaie de créer un site via les Apis :

2020-04-23 09:47:07,370 ERROR [com.simplicite.util.engine.ObjectManager] SIMPLICITE|http://88e435b64c79:8080||ECORED0001|awrfs02|com.simplicite.util.engine.ObjectManager|validate||Error postValidate hook error
    java.lang.ClassCastException: class com.simplicite.objects.RenaultSites.SitesRealEstateSite cannot be cast to class com.simplicite.objects.RenaultSites.SitesRealEstateSite (com.simplicite.objects.RenaultSites.SitesRealEstateSite is in unnamed module of loader com.simplicite.util.engine.DynamicClassLoader @4ffe4e42; com.simplicite.objects.RenaultSites.SitesRealEstateSite is in unnamed module of loader com.simplicite.util.engine.DynamicClassLoader @7f5f52ab)
     at com.simplicite.objects.RenaultSites.SitesRealEstateAssetOrch.postValidate(SitesRealEstateAssetOrch.java:87)
     at com.simplicite.util.engine.ObjectManager.validate(ObjectManager.java:170)
     at com.simplicite.util.ObjectDirect.validate(ObjectDirect.java:158)
     at com.simplicite.util.ObjectDB.validate(ObjectDB.java:542)
     at com.simplicite.util.ObjectDB.validate(ObjectDB.java:530)
     at com.simplicite.util.tools.BusinessObjectTool.validate(BusinessObjectTool.java:281)
     at com.simplicite.util.tools.BusinessObjectTool.validateAndCreate(BusinessObjectTool.java:380)
     at com.simplicite.webapp.services.RESTMappedObjectsExternalObject.post(RESTMappedObjectsExternalObject.java:1216)
     at com.simplicite.webapp.services.RESTServiceExternalObject.display(RESTServiceExternalObject.java:364)
     at com.simplicite.webapp.servlets.AbstractExternalObjectServlet.service(AbstractExternalObjectServlet.java:124)
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
     at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
     at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
     at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
     at com.simplicite.webapp.filters.RewriteFilter.doFilter(RewriteFilter.java:63)
     at com.simplicite.webapp.filters.AbstractFilter.doFilter(AbstractFilter.java:37)
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:188)
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
     at com.simplicite.tomcat.valves.APISessionValve.invoke(APISessionValve.java:187)
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:688)
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
     at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
     at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
     at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
     at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
     at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
     at java.base/java.lang.Thread.run(Thread.java:830)

Je suis obligée de redéployer pour que cette erreur disparaît, et je reprends ma création de sites.

Sauriez vous à quoi peut être liée cette erreur

En vous remerciant

Vous devez avoir des méthodes static (ou des dépendances static) empêchant les classes de se décharger lorsque que vous recompilez, cette action change le classloader dynamique à la volée, mais l’ancien ne peut pas être détruit.

Lorsque le nouveau classloader (avec votre nouveau code) essaye de caster votre classe, il en trouve 2 définitions dans 2 classloaders (l’ancien et le nouveau), et ne sait laquelle choisir (ClassCastException).

Il faut éviter de faire des (cast) et plutôt utiliser des ObjectDB ou alors passer par des “invoke methode” sans caster l’objet. Il faut également éviter les méthodes “static” sauf si elles sont rarement modifiées. Sinon pas d’autre choix que de redemarrer la JVM pour tuer les vielles références “static”, les mécanismes Java ne permettent pas de les “tuer” par code.

En V5, c’est une raison pour laquelle le GrantHooks devient deprecated car toutes ses méthodes static ne permettent pas un rechargement dynamique à chaque recompilation. Il devienda un PlatformHooks non static implementant les mêmes hooks que GrantHooks.

Bonjour François, Non je ne fais justement aucun cast, j’utilise effectivement des ObjetDB, ce qui me surprends encore plus

C’est le code de ce hook qu’il faut analyser (ligne 87).

Au niveau de cette ligne j’ai:
res = (SitesRealEstateSite) getGrant().getTmpObject(“SitesRealEstateSite”);
resTool = new BusinessObjectTool(res);

sachant que:
private SitesRealEstateSite res;
private transient BusinessObjectTool resTool;

C’est donc clairement un Cast d’objet ObjectDB en SitesRealEstateSite.
Cet objet doit avoir des dépendances static persistantes…

Pourquoi avez-vous besoin de faire ce cast si vous n’utilisez que les méthodes d’ObjectDB ?

private ObjectDB res;
res = getGrant().getTmpObject(“SitesRealEstateSite”);

Avec ou sans simplicité, vous ne pourriez pas redéployer votre code à chaud sans redémarrer tomcat.
Ce serait trop long d’analyser votre code et retrouver les objets static.

D’accord, je vais essayer avec ta proposition, je te remercie pour ces éclaircissements :)
Bonne journée