在DRL文件上引发异常时,得到“无法使用严格模式解析方法:org.drools.core.spi.KnowledgeHelper.throw()”

时间:2019-06-19 01:05:42

标签: spring-boot drools

我正在尝试与Spring Boot进行Drools集成,并且如果不满足模型的属性,想抛出异常。

对于这种情况,我有一个Client模型,想检查其lastName字段是否为NULL-如果是,则抛出异常。

但是,在编译期间,我收到“无法使用严格模式解析方法:org.drools.core.spi.KnowledgeHelper.throw()”的信息。尝试此操作的正确方法是什么?

我尝试使用global来更新字段,但是它正在工作,为了方便起见,我只想在消息中引发异常。

下面是我的配置文件:

@Configuration
public class CreateClientRuleEngineConfig {

    public static final String bhfCreateClientRule = "CreateClientRule.drl";

    @Bean
    public KieContainer kieContainer() {
        KieServices kieServices = KieServices.Factory.get();

        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        kieFileSystem.write(ResourceFactory.newClassPathResource(bhfCreateClientRule));
        KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
        kieBuilder.buildAll();
        KieModule kieModule = kieBuilder.getKieModule();

        return kieServices.newKieContainer(kieModule.getReleaseId());

    }

}

========================================= 以下是我的DRL文件:

import com.test.rulengine.entity.Client;
import com.test.rulengine.exception.CreateClientException;

dialect  "mvel"

rule "Required fields"
    when
        clientInstance: Client( lastName == null);
    then
        throw new CreateClientException("LastName is required");
end

=======================================

以下是我的Maven依赖关系(注意:我没有包括与Drools / Kie不相关的其他依赖关系):

    <properties>
        <java.version>1.8</java.version>
        <drools-version>7.0.0.Final</drools-version>
        <kie-version>7.0.0.Final</kie-version>
    </properties>

    <dependencies>

        <!-- Drools/Kie dependencies -->
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>${drools-version}</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>${kie-version}</version>
        </dependency>

=======================================

这是编译期间的错误:

  

无法分析表达式引发新的CreateClientException(“ LastName is required”);:   [错误:无法使用严格模式解析方法:org.drools.core.spi.KnowledgeHelper.throw()]   [附近:{...抛出新的CreateClientExceptio ....}                ^   [第6行,第0列]:[规则名称=“必填字段”]

我已经检查了此链接,因此我真的无法弄清我所缺少的内容。预先谢谢你

2 个答案:

答案 0 :(得分:0)

您必须在您的drl文件中删除“方言“奇迹””关键字。

答案 1 :(得分:0)

这似乎是mvel的局限性。在then块中使用java方法,下面仅是一个示例。用静态方法专用于一个类,并在相应的then块中执行它们。用Java代码编写Java代码...

import org.droolsassert.Client;
import org.droolsassert.CreateClientException;
import com.google.common.base.Preconditions;

dialect  "mvel"

rule "Required fields"
    when
        clientInstance: Client( lastName == null)
    then
        Preconditions.checkArgument(false, "LastName is required");
end