【问题标题】:Easy-rules: set rule name in a POJO using a contructor简单规则:使用构造函数在 POJO 中设置规则名称
【发布时间】: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


    【解决方案1】:

    愚蠢的错误:BasicRule 扩展有效,但您需要覆盖执行和评估方法,而不是使用注释。

    现在一切正常!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-03
      • 2021-08-08
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多