我有以下规则
@Rule
@Slf4j
public class ModuleRule{
private Content content;
private String baseDir;
@Condition
public boolean when(Facts facts) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
content = facts.get("content");
baseDir = facts.get("base_dir");
Method getModule = content.getClass().getMethod("get"+name);
return (boolean) getModule.invoke(content);
}
@Action
public void then(@Fact("toInclude") List<Template> selectedTemplates) throws IOException, TemplateGenUtilsException {
log.info("Adding module:" + name);
final String moduleTemplatesPath = String.format("%s/%s", baseDir, name);
selectedTemplates.addAll(FileUtils.replacePath(moduleTemplatesPath, FileUtils.loadTemplates(name), content.getDOMAIN(), content.getAPP_NAME()));
}
}
通过以下方式实例化:
@Bean
public Rules rules() {
Rules rules = new Rules();
templatesConfig.getModules().stream() . //Modules is a list of String
.map(ModuleRule::new)
.forEach(rules::register);
return rules;
}
该代码无法像第一次注册后一样工作,其他规则具有相同的名称,因此不会被注册。
因此,这是我的问题:有没有办法在运行时创建新规则并设置其名称?
我还尝试扩展BasicRules,这里的问题是,当引擎点火时,不会评估该规则。这是代码:
@Slf4j
public class ModuleRule extends BasicRule{
private Content content;
private String templatesBaseDir;
public ModuleRule(String name) {
super(name);
}
@Condition
public boolean when(Facts facts) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
content = facts.get("content");
templatesBaseDir = facts.get("base_dir");
Method getModule = content.getClass().getMethod("get"+name);
return (boolean) getModule.invoke(content);
}
@Action
public void then(@Fact("toInclude") List<Template> selectedTemplates) throws IOException, TemplateGenUtilsException {
log.info("Adding module:" + name);
final String moduleTemplatesPath = String.format("%s/%s", templatesBaseDir, name);
selectedTemplates.addAll(FileUtils.replacePath(moduleTemplatesPath, FileUtils.loadTemplates(name), content.getDOMAIN(), content.getAPP_NAME()));
}
解决方案如下:
愚蠢的错误:BasicRule扩展有效,但是您需要覆盖execute和valuate方法,而不使用注释。
现在一切正常!