Как обрабатывать динамический Json / класс в Drools? - PullRequest
0 голосов
/ 27 ноября 2018

Я пишу сервис RESTful для вычисления некоторых значений в соответствии с некоторыми правилами.

Например:

Существует такой JSON:

{ "amount": 100,
  "destination":"A"
}

Thisdata - это тело запроса, отправьте его моему контроллеру:

@RequestMapping(value = "/orders", method= RequestMethod.POST)
public void getOrderRequest(@RequestBody Order order){

// use Drools to calculate and return the result

}

Вот класс сущностей:

public class Order{
    private Integer amount;
    private String destination;
    private Float price;
    // getters and setters
}

Я использую Drools для расчета цены (поддельный код):

package rules
import entity.Order
rule "rule1"
    no-loop true
    lock-on-active true
    salience 1
    when
        $s : Order(amount <= 50 && destination=="A") 
    then
        $s.setPrice(1000);
        update($s);

rule "rule2"
    no-loop true
    lock-on-active true
    salience 1
    when
        $s : Order(amount > 50 && destination=="A") 
    then
        $s.setPrice(2000);
        update($s);

Это работает нормально. Все правила можно изменять и работать без перезапуска моей службы REST.

Вот сценарий, новое поле добавлено в заказ JSON:

{ "amount": 100,
  "destination":"A",
  "customer":"Trump"
}

Добавить новое правило: если клиентом является Трамп, то удвойте цену:

rule "rule3"
    no-loop true
    lock-on-active true
    salience 1
    when
        $s : Order(customer == "Trump") 
    then
        $s.setPrice(price * 2);
        update($s);

Но мне нужно добавить новую переменную в мой класс Order и перезапустить мой сервис.

Интересно, есть ли способ сделать это без перезапуска моего REST-сервиса?

Или я могу просто динамически обрабатывать данные JSON с другими BRMS?

1 Ответ

0 голосов
/ 29 ноября 2018

Используйте карту для переноса всех деталей заказа:

public class Order{
    private Map<String, Object> fields;
    // getters and setters
}

Если вам удастся добавить значения из JSON в карту, вы можете написать свое правило следующим образом:

rule "rule3"
    no-loop true
    lock-on-active true
    salience 1
    when
        $s : Order(fields["customer"] == "Trump") 
    then
        $s.setPrice(price * 2);
        update($s);
...