如何从drools规则调用springbean中的方法

hc2pp10m  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(504)

我有一个drools规则来检查数据库中是否存在值。但是在检查之前,我需要将值传递给springbean方法,以便在检查值之前进行加密,因为数据库中的值是加密的。
服务

public class EncryptService {
    public String encrypt(String value) {
    return encryptedValue;
    }
}

规则

rule "Check value"
    salience 10
    dialect "java"
     when
        $g: EncryptService()
        exists($g.encrypt(value))
     then
        log.info('value already exists')
end

如何调用该方法来加密springbean的规则?

我试过的东西

通过全局变量声明。通过new示例化,就像上面的例子一样,但是这不起作用,因为它是一个已经由spring创建的bean。

njthzxwz

njthzxwz1#

您需要将bean示例传递到您的规则会话中,然后编写的规则将执行您希望它执行的操作。
例如--

@Component
class RuleExecutor {

  private final EncryptService encryptService; // Bean set via constructor injection

  public RuleExecutor(EncryptService encryptService) {
    this.encryptService = encryptService;
  }

  public void fireRules( ... ) { // assuming other data passed in via parameter
    KieSession kieSession = ...; 
    kieSession.insert( this.encryptService ); // insert bean into the working memory
    kieSession.insert( ... );  // insert other data into working memory
    kieSession.fireAllRules();
  }
}

然后可以在规则中对bean示例执行操作:

rule "Encrypt value"
when
  SomeInput( $originalValue: value )
  $e: EncryptService() // will match the bean instance in working memory
then
  String encrypted = $e.encrypt($originalValue);
  // do stuff with encrypted value, eg: insert(encrypted)
end

语法 $e: EncryptService() 不会创建新示例。它匹配工作内存中encryptservice的现有示例,没有其他限制。这和你做类似的事情的逻辑是一样的 $car: Car( doors == 4, color == "red") --这不会用这些变量创建一个新的car示例,而是在工作内存中找到一个具有这些限制的car示例,并将它们分配给变量$car。

相关问题