在RESTJava中读取drools规则
我正在尝试使用Jersey通过Java(JAX-RS)阅读REST中的.drl drools规则 我将.drl文件放在WEB-INF/rules文件夹中,并尝试用这行代码读取它们在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
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)