简易规则:使用构造函数在POJO中设置规则名称

2019年6月13日 6点热度 0条评论

我有以下规则

@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方法,而不使用注释。

现在一切正常!