Validation d'un objet fils lors du changement d'etat d'un objet parent

Request description

Lors du changement d’état d’un objet parent, nous aimerions vérifier les champs obligatoires de l’objet fils. Nous avons remarqué que ce changement d’état n’appelle pas forcément le validate (prevalidate et postvalidate) de l’objet fils. Pour résoudre ce problème, nous avons utilisé getTmpObject(objetFils) et objetFilsTool.validate() dans le preValidate de l’objet parent pour empêcher le changement d’état si un attribut obligatoire n’est pas renseigné dans l’objet fils.

À ce stade, des pop-ups en rouge apparaissent pour indiquer que les champs obligatoires ne sont pas renseignés, mais ne bloquent pas la mise à jour de l’état.

Nous avons essayé de récupérer un retour depuis la méthode validate() comme suit : List<ReturnMessage> response = objetFilsTool.validate(); mais nous trouvons toujours null.

Existe-t-il une méthode pour récupérer le retour de validate() ? Ainsi, si nous arrivons à ajouter un message d’erreur dans le preValidate de l’objet parent, nous pourrons empêcher la transition d’état.

Instance /health
[Platform]
Status=OK
Version=5.3.16
BuiltOn=2023-09-29 15:24
Git=5.3/ada6e86492cace177cb57b570853c82fab936aab
Encoding=UTF-8
EndpointIP=172.18.0.2
EndpointURL=http://acd681728717:8080
TimeZone=UTC
SystemDate=2023-12-05 16:01:24

[Application]
ApplicationVersion=3.10.0
ContextPath=
ContextURL=http://localhost:8080
ActiveSessions=1
TotalUsers=14
EnabledUsers=10
LastLoginDate=2023-12-05 14:30:09

[Server]
ServerInfo=Apache Tomcat/9.0.80
ServerType=WEB
ServerActiveSessions=1
ServerSessionTimeout=30
CronStarted=true

[OS]
Name=Linux
Architecture=amd64
Version=5.10.102.1-microsoft-standard-WSL2
DockerImageName=centos7
SystemEncoding=UTF-8

[JavaVM]
Version=17.0.8.1
Vendor=Eclipse Adoptium
VMName=OpenJDK 64-Bit Server VM
VMVersion=17.0.8.1+1
ScriptEngine=rhino
ScriptEngineVersion=Rhino 1.7.13 2020 09 02
HeapFree=291935
HeapSize=669696
HeapMaxSize=763904
TotalFreeSize=386143

[Cache]
ObjectCache=227
ObjectCacheMax=10000
ObjectCacheRatio=2
ProcessCache=227
ProcessCacheMax=10000
ProcessCacheRatio=2
APIGrantCache=0
APIGrantCacheMax=1000
APIGrantRatio=0

[Database]
Vendor=3
ProductName=PostgreSQL
ProductVersion=13.6 (Debian 13.6-1.pgdg110+1)
DriverName=PostgreSQL JDBC Driver
DriverVersion=42.6.0
DBDate=2023-12-05 16:01:24
DBDateOffset=0
DBPatchLevel=5;P03;eae816e5089006449212ca1f2a1fc9f4
UsingBLOBs=true

[Healthcheck]
Date=2023-12-05 16:01:24
ElapsedTime=363

Sans l’intégratlité du code de votre preValidate c’est compliqué de vous aider.

Déjà, est-ce que les termes parent/fils concernent un heritage ou des relations. La partie de modèle correspondant à votre cas pourrait aussi nous aider à mieux comprendre votre cas d’usage.

Bonjour David,

Nous avons un objet parent LadDossierPmfp et un objet enfant LadSouhaitOrientation. C’est une relation 0, 1 où LadSouhaitOrientation détient une clé technique pour faire la liaison avec LadDossierPmfp. Nous souhaitons récupérer la list de ReturnMessage lors du changement d’état depuis LadDossierPmfp:

 @Override
    public List<String> preValidate() {
        List<String> msgs = new ArrayList<>();
        ObjectDB ladSouhaitOrientation = g.getTmpObject("LadSouhaitOrientation");
        ladSouhaitOrientation.resetFilters();
        ladSouhaitOrientation.setFieldFilter("ladSouhDospmfpId", getRowId());
        BusinessObjectTool ladSouhaitOrientationTool = ladSouhaitOrientation.getTool();
        List<String[]> search = ladSouhaitOrientation.search();
        List<BusinessObjectTool.ReturnMessage> validateMessage = new ArrayList<>();
        if(!Tool.isEmpty(search) && ladSouhaitOrientation.select(search.get(0)[0])) {
            try {

                validateMessage = ladSouhaitOrientationTool.validate(); // validate() retourne null
        //reste du code
      
       return msgs;
    }

OK parent/enfant au sens d’une relation 0-N (ici 0-1).
Votre objet panel (“enfant”) est il inliné dans l’objet principal (“parent”) ?
Je pose la question car il me semble que ce pattern vous éviterait à priori d’avoir à écrire du code (je dis ça sous contrôle de @Francois car je n’utilise personnellement jamais de relation 0-1 inlinées mais plutôt des héritages)

En tout cas à la lecture de votre code je ne vois pas ce que vous faites de votre variable validateMessage. Si vous voulez que ça remonte des erreurs au niveau de l’objet principal, il faut les ajouter (ou une erreur ad hoc) à la liste de messages retournés par le preValidate.

Si au moins un message d’erreur est retrourné par ce preValidate ça bloquera le save.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.