在RESTJava中读取drools规则

在RESTJava中读取drools规则,java,rest,drools,rules,Java,Rest,Drools,Rules,我正在尝试使用Jersey通过Java(JAX-RS)阅读REST中的.drl drools规则 我将.drl文件放在WEB-INF/rules文件夹中,并尝试用这行代码读取它们 private RuleBase trainingRules; private RuleBase kuperMaleTrainingResultsRules; private RuleBase kuperFemaleTrainingResultsRules; private RuleBase basicTraining

我正在尝试使用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)
任何人都知道如何解读这些规则?把它们放在哪里


非常感谢您阅读本文,它对我意义重大。

使用ControllerDrools.class.getResourceAsStream(rulesPath),您的路径应该是ControllerDrools类包中的相对路径

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

您还可以使用以下语法创建绝对路径:

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

如果您使用maven,我建议您将drl文件直接放在“src/main/resources”中。

一些调试可能有助于检查NPE。您可以从path中省略/WEB-INF/然后再试一次吗?使用类似于“rules/ZatraziTrening.drl”的路径。尝试了它,但仍然存在相同的问题不使用maven:/如果您想让此代码使用Reader source=new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream(rulesPath));使用以下路径:“/rules/ZatraziTrening.drl”;同样的问题。tnx的回应。你能试着把你的drl直接和你的代码放在一起吗。因此,我们将确保它位于类路径中。然后像这样访问它。getClass().getClassLoader().getResourceAsStream(“/com/mycompany/myproject/ZatraziTrening.drl”)路径到drl文件:src\fon\tastic\runner\expertSystem代码:Reader source=new InputStreamReader(this.getClass().getClassLoader().getResourceAsStream(“fon/tastic/runner/expertSystem/ZatraziTrening.drl”);仍然是空指针异常。这很奇怪。为了确保您的drl位于类路径中,请将其放在“WEB\u INF/lib/fon/tast”中‌​ic/runner/expertSystem/ZatraziTrening.drl”。然后尝试像读卡器source=newInputStreamReader(Thread.currentThread().getContextClassLoader().getResourceAsStream(“fon/tast”)那样访问它‌​ic/runner/expertSystem/ZatraziTrening.drl”);
this.getClass().getClassLoader().getResourceAsStream(rulesPath)