【发布时间】:2020-03-23 11:30:54
【问题描述】:
我有以下规则
@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()));
}
【问题讨论】:
标签: java easy-rules