休息时阅读流口水规则 java

Reading drools rules in rest java

我正在尝试使用 Jersey Java (JAX-RS) 在我的 REST 中读取 .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 class 包的 relative

要使您的路径 绝对,您应该添加一个前导斜杠“/rules/ZatraziTrening.drl”

您还可以使用以下语法来获得绝对路径:

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

如果你用maven,我建议你直接把drl文件放在"src/main/resources"