Как вернуть объект loanApplication из правила в процесс bpm? - PullRequest
1 голос
/ 20 июня 2019

Я использую drools (веб-интерфейс kie-wb), и у меня есть процесс bpm, который принимает loanApplication и возвращает loanApplication с обновленными данными (это цель). Но когда я пытаюсь это сделать, меня возвращают.

"Unable to create response: [LoanApplicationReviewer.LoanApplicationReview:21 - Age Knockout:1] -- [LoanApplicationReviewer.LoanApplicationReview:21 - Age Knockout:1] -- null"

Моя модель данных:

public class LoanApplication implements java.io.Serializable {

    static final long serialVersionUID = 1L;

    private java.lang.Integer id;
    private java.lang.Integer age;
    private boolean accepted = true;
    private java.util.List<java.lang.String> knockoutReasons = new java.util.ArrayList<java.lang.String>();


    public LoanApplication() {
    }

    public java.lang.Integer getId() {
        return this.id;
    }

    public void setId(java.lang.Integer id) {
        this.id = id;
    }

    public java.lang.Integer getAge() {
        return this.age;
    }

    public void setAge(java.lang.Integer age) {
        this.age = age;
    }

    public boolean isAccepted() {
        return this.accepted;
    }

    public void setAccepted(boolean accepted) {
        this.accepted = accepted;
    }

    public java.util.List<java.lang.String> getKnockoutReasons() {
        return this.knockoutReasons;
    }

    public void setKnockoutReasons(
            java.util.List<java.lang.String> knockoutReasons) {
        this.knockoutReasons = knockoutReasons;
    }

    public void addKnockoutReason(String knockoutReason) {
        if (this.knockoutReasons == null) {
            this.knockoutReasons = new java.util.ArrayList<java.lang.String>();
        }
        this.knockoutReasons.add(knockoutReason);
    }



    public String toString() {
        return "loanApplicationResponse::[accepted=" + this.accepted 
        + ",knockoutReasons="
        + this.knockoutReasons.toString() + "]";
    }

    public LoanApplication(java.lang.Integer id, java.lang.Integer age,
                           boolean accepted, java.util.List 
                           knockoutReasons) {
        this.id = id;
        this.age = age;
        this.accepted = accepted;
        this.knockoutReasons = knockoutReasons;
    }
}

и мое правило:

package com.xyz.loanapplicationreviewer;

import com.xyz.loanapplicationreviewer.LoanApplication;
import org.kie.api.runtime.process.WorkflowProcessInstance;

rule 'age less than 30 do not accept'
ruleflow-group 'ageKnockoutGroup'
  dialect "mvel"
  when
    $process : WorkflowProcessInstance();
    $loanApp : LoanApplication() from (LoanApplication)$process.getVariable("loanApplication");
    eval ($loanApp.getAge() < 30);
  then
    $loanApp.setAccepted(false);
    $loanApp.addKnockoutReason("age under 30");
    ((WorkflowProcessInstance)kcontext.getKnowledgeRuntime().getProcessInstance($process.getId())).setVariable("loanApplication", $loanApp);
    System.out.println("Age less than 30 knockout");
end

Я добавил сценарий ввода на шаге бизнес-правила, чтобы заполнить экземпляр процесса следующим образом:

kcontext.getKnowledgeRuntime().insert(kcontext.getProcessInstance()); 

Я также заполнил то, что, как я ожидаю, будет моим назначением данных. Похоже, он получает данные, потому что, когда я создаю новый экземпляр и запускаю его из формы, в которой есть данные и выполняет правило, просто из интерфейса остальных, используя swagger, я получаю вышеуказанную ошибку.

1 Ответ

1 голос
/ 24 июня 2019

Посмотрев на это очень долго;

Кажется, мне пришлось немного изменить свой запрос, чтобы он стал:

{
  "loanApplication" : {
    "com.xyz.abc.LoanApplication" : {
      "id" : 1,
      "age": 1,
      "accepted" : true
    }
  }
}

Далее мне пришлось изменить правило, чтобы оно выглядело как:

rule 'age less than 30 do not accept'
  ruleflow-group 'ageKnockoutGroup'
  dialect "mvel"
  when
    loanApplication : LoanApplication(age < 30);
    //process : WorkflowProcessInstance();
    //loanApp : LoanApplication() from (LoanApplication)process.getVariable("loanApplication");
    //eval (loanApp.getAge() < 30);
  then
    loanApplication.setAccepted(false);
    loanApplication.addKnockoutReason("age under 30");
    System.out.println("in then less than 30 with loanApp:" + loanApplication.toString());
    String knockoutReasonFact = "age under 30";
    boolean acceptedFact = false;
    insert(knockoutReasonFact);
    insert(acceptedFact);
    update(loanApplication);
end

Используя все те же конечные точки, я в итоге получил ответ, который ожидал.Я только закончил тем, что проследил, как business central обращался к моему процессу drools / jbpm, и просто отразил это.

...