Appeler sous procesus avec contrat complexe

1
0
-1

Bonjour,

Je suis en BOS 7.8.1 Open Source

J'ai 2 pool:
-Un maitre qui appel un sous processus
-un esclave avec un contrat qui contient des éléments complexe (Objets imbriqués)

J'ai declaré un objet Virement en BDM que je set dans le processus maitre mais qui sera modifié par l'escave (pas la même granularité)

J'arrive à appeler le sous process en lui passant des éléments simples (String, int....) (en alterant mon contrat) mais pas des éléments complexes

J'ai essayé en passant l'objet directement

ROOT_PROCESS_INSTANCE_ID=17001 | FLOW_NODE_DEFINITION_ID=7125456696834110264 | FLOW_NODE_INSTANCE_ID=180009 | FLOW_NODE_NAME=Traitement SCF | org.bonitasoft.engine.core.process.instance.api.exceptions.SContractViolationException: Error while validating expected inputs: [com.company.model.Virement@6b436ab8 cannot be assigned to COMPLEX type]"

J'ai essayé de passer directement l'objet en JSON mais sans succes
retour="{\"monVirementInput\":\
{\"Banque\":\"BCI\"\
,\"nomtire\":\"JOSUE\"\
,\"listepart\":[{\"periode\":\"2T2018\"}]\
,\"DateComptable\":\"2019-05-22T00:00:00.000Z\"\
,\"montantAVentiler\":12121212121}\
}";

J'ai essayé en "JSONIFIANT" mon objet
return new JsonBuilder( monVirement ).toPrettyString()

Je pourrais contourner en passant le persistence ID mais j'aimerais gardé la cohérence de mon sous process avec son contrat

Quelqu'un a t'il une idée?

2 answers

1
0
-1

En effet passer par un objet map fonctionne pour un seul objet complex
{"monObjetInput":{"valueN1":"n1"}}

mais pas pour des objets complex imbriques
{"monObjetInput":{"valueN1":"n1","subValueN2":{"valueN2":"n2"}}}

Error while validating expected inputs: [com.company.model.TestSubObject@20a290a9 cannot be assigned to COMPLEX type, {persistenceId=null, class=class com.company.model.TestObject, subValueN2=com.company.model.TestSubObject@20a290a9, valueN1=BCI, persistenceVersion=null} cannot be assigned to COMPLEX type]

Après c'est peut etre lié à ma facon d'initialiser ma variable envoyée à l'imput

def testObjectVar = new com.company.model.TestObject()
testObjectVar.valueN1="BCI"
def testObjectVar2= new com.company.model.TestSubObject();
testObjectVar2.valueN2="1T2018"
testObjectVar.subValueN2=testObjectVar2;
return testObjectVar.getProperties()

1
0
-1

Salut,

Personnellement, pour ce qui est de faire passer des objets de base de données, j'utilise la persistanceId.
Ensuite pour faire passer un objet complexe, tu peux le faire.
- Dans ton processus racine, tu créer un objet de type 'Map', que tu créais à partir de ton objet 'Virement', pour la créer, utilise la méthode suivante "monVirement.getProperties()".
Tu la lie ensuite à ton input de contrat de ton sous processus.

  • Dans ton sous processus, tu définis un objet de type complexe avec tous tes champs mais de type String (virementInput). Ensuite tu créer une variable du type que tu souhaite faire passer ('Virement ' dans ton cas), et tu l'initialise de cette façon:

def virement= new com.exempleVirement()
virement.Banque= virementInput.Banque
virement.montantAVentiler= virementInput.montantAVentiler.toFloat()
...
return virement

Normalement ça devrait marcher ;)

Notifications