Erreur de cast sur des BO

Bonjour,

Je rencontre une erreur que je n’arrive pas a régler :

class com.simplicite.objects.name.NamCandidat cannot be cast to class com.simplicite.objects.name.NamJeune (com.simplicite.objects.name.NamCandidat and com.simplicite.objects.name.NamJeune are in unnamed module of loader com.simplicite.util.engine.DynamicClassLoader @6948b433)

qui correspond a cette ligne de code selon la stack :

NamJeune namJeune = (NamJeune) getGrant().getTmpObject("NamJeune");

quelques précisions :

  • NamJeune a bien un module selon l’ihm
  • Je cast mon objet car j’ai besoin de le créer a cette endroit et d’appeler avant le hook preValidate pour appliquer la logique qu’il contient et qui selon le principe de resposabilité doit rester dans namJeune.

Merci par avance
Adrien Olivier

Avant tout, dans Simplicité un cast ne sert à rien dans 99% des cas, et dans le 1% qui reste c’est souvent discutable.

Si vous faites ObjectDB o = getGrant().getTmpObject("MyObject") puis plus loin un o.validate() c’est bien les hooks prePostValidate de la classe MyObject qui sont executés.

Si MyObject hérite (au sens Simplicite + au sens du extends Java au niveau des classes) de MyFatherObject ça appellera ceux de la classe ce dernier (sauf s’il sont surchargés auquel cas c’est à vous de mettre explicitement l’appel à super.pre/PostValidate si c’est pertinent)

Bref, je ne sais pas exactement ce que vous voulez faire mais regardez si ce cast a vraiment un intéret dans le contexte.

Sinon pour ce qui est de l’erreur de cast proprement dite je vais laisser @Francois répondre car ce message relatif au classloader dynamique ne me dit rien

merci pour la réponse, l’utilisation de o.validate() a résolus mon problème.

En général l’idéal dans le code métier c’est de vous servir du wrapper BusinessObjectTool (cf. https://docs.simplicite.io/4.0/javadoc/com/simplicite/util/tools/BusinessObjectTool.html) qui offre des méthodes simplifiées (ex: validateAndSave) et marche à coup d’exceptions y compris pour les erreur métier (contrairement aux méthodes d’ ObjectDB qui ne remontent que des exceptions techniques et retournent les messages métier sous forme de strings à analyser specifiquement)

Petite précision : le “module” dont parle le pb de CAST de la JVM n’a rien à voir avec un Module Simplicité. C’est une autre notion dans Java qui permet de découper des classloaders en module, mais Simplicité n’en a pas besoin (d’où le unnamed par défaut).

Le rechargement de classe à la volée n’est pas simple en Java surtout si les anciennes classes sont déjà chargées dans des sessions dans un autre classloader.

Vous êtes dans un cas où la classe dans le nouveau class-loader essaye de caster une classe d’un autre class-loader (ancien) ce qui est illégal, un clear-cache global et/ou un logout doit résoudre le problème pour que la session passe par un unique classloader + garbage les anciens. Dans les logs vous devez voir les Classsloader se remplacer de temps en temps suite à recompilation de vos objets

Quand on passe par des ObjectDB ont a jamais ce problème de CAST car ce code ne change pas (validate, create, update, save, delete, invokeAction, select, search…) et respecte la logique des hooks pre/post.