簡體   English   中英

在Rest Java中讀取Drools規則

[英]Reading drools rules in rest java

我正在嘗試使用Jersey閱讀Java REST(JAX-RS)中的.drl drools規則。

我將.drl文件放在WEB-INF / rules文件夾中,並嘗試使用此行代碼讀取它們

private RuleBase trainingRules;
private RuleBase kuperMaleTrainingResultsRules;
private RuleBase kuperFemaleTrainingResultsRules;
private RuleBase basicTrainingResultsRules;

private final String trainingRulesPath = "/WEB-INF/rules/ZatraziTrening.drl";
private final String kuperMaleTrainingResultsPath = "/WEB-INF/rules/KuperMuski.drl";
private final String kuperFemaleTrainingResultsPath = "/WEB-INF/rules/KuperZenski.drl";
private final String trainingResultsRulesPath = "/WEB-INF/rules/RezultatiTreninga.drl";

private static ControllerDrools INSTANCE;

private ControllerDrools() {
    try {
        this.trainingRules = loadRules(trainingRulesPath);
        this.kuperMaleTrainingResultsRules = loadRules(kuperMaleTrainingResultsPath);
        this.kuperFemaleTrainingResultsRules = loadRules(kuperFemaleTrainingResultsPath);
        this.basicTrainingResultsRules = loadRules(trainingResultsRulesPath);
    } catch (DroolsParserException | IOException e) {
        // TODO: dodati ispis poruke u logger
        e.printStackTrace();
    }
}

private RuleBase loadRules(String rulesPath) throws DroolsParserException, IOException {
    Reader source = new InputStreamReader(ControllerDrools.class.getResourceAsStream(rulesPath));

    PackageBuilder builder = new PackageBuilder();

    builder.addPackageFromDrl(source);

    Package pkg = builder.getPackage();

    // Kreiranje baze znanja i dodavanje paketa u nju
    RuleBase ruleBase = RuleBaseFactory.newRuleBase();
    ruleBase.addPackage(pkg);
    return ruleBase;
}

public static ControllerDrools getInstance() {
    if (INSTANCE == null) {
        INSTANCE = new ControllerDrools();
    }
    return INSTANCE;
}

/**
 * Get's the training from drools
 * @param user
 * @return training to do
 */
public Training getTrening(User user) {

    user.setNumberOfTrainingInCategory(user.getNumberOfTrainingInCategory() + 1);

    Training training = new Training();
    training.setUser(user);

    try {
        WorkingMemory workingMemory = trainingRules.newStatefulSession();

        workingMemory.insert(user);
        workingMemory.insert(training);
        workingMemory.insert(user.getCategory());

        workingMemory.fireAllRules();

    } catch (Exception e) {
        // TODO: logger
        e.printStackTrace();
    }

    return training;

}

但我明白了

java.lang.NullPointerException
                java.io.Reader.<init>(Unknown Source)
                java.io.InputStreamReader.<init>(Unknown Source)
                loadRules(ControllerDrools.java:48)

這是這條線

Reader source = new InputStreamReader(ControllerDrools.class.getResourceAsStream(rulesPath));

任何機構都知道如何閱讀此規則? 放在哪里?

非常感謝您閱讀本文,對我來說意義重大。

使用ControllerDrools.class.getResourceAsStream(rulesPath),您的路徑應該相對於 ControllerDrools類包。

要使路徑絕對 ,應添加一個斜杠“ /rules/ZatraziTrening.drl”

您還可以使用以下語法來獲取絕對路徑:

this.getClass().getClassLoader().getResourceAsStream(rulesPath)

如果您使用Maven,我建議您將drl文件直接放在“ src / main / resources”中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM