休息时阅读流口水规则 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"
我正在尝试使用 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"