0

示例 XML 规则文档:

<user>
  <username>
     <not-null/>
     <capitals value="false"/>
     <max-length value="15"/>
  </username>
  <email>
     <not-null/>
     <isEmail/>
     <max-length value="40"/>
  </email>
</user>

我该如何实施?我从头开始,我目前拥有的是一个用户类和一个用户控制器,它将用户对象保存在数据库中(通过服务层和道层),基本的 Spring MVC。我不能使用 Spring MVC 验证,但是在我们的模型类中,我必须使用 XML 文档,以便管理员可以更改规则

我认为我需要一种模式,它可以根据 XML 规则文档提供的内容动态构建算法,但除了大量的 if 语句之外,我似乎想不出任何东西。

我也没有什么可以解析的,我不确定我将如何将它与验证过程的实际实现(分离)耦合。

4

2 回答 2

1

这个轮子已经被改造了很多次了!

您可能可以通过实现 Spring 的Validator接口来使用 Spring MVC 验证,但您可能需要实现或找到一种方法来基于通过另一种方式加载的规则进行验证。

搜索并找到了许多描述如何在 Spring 中使用公共验证的页面。作为奖励,有些人描述了使用 valang。如果您的管理员可以在部署之前编辑验证规则,那么其中之一可能就足够了。

如果您真的想创建一个本地 XML 业务规则,您可能需要使用Apache Digester解析规则。您可能希望将规则加载到您自己的 Spring Validator 接口实现所使用的数据结构中。

如果部署后必须更改规则,您当然需要添加一种机制来刷新规则。但至少 Digester 可能仍然会在那里提供帮助。

于 2010-05-10T12:20:57.927 回答
0

也许一个例子是:

  //PSEUDOCODE
  abstract class Validator {
    Map<String method, Set<Field> fields> validationMap;
    Map<String fieldName, Set<String> errorMessages> validationErrors;

 void parseXML() {
     validationMap.add("notNull", { " 'username', 'JavaPete' ", " 'email', 'pete@java.com' " }
     validationMap.add("max-length", { " 'username', 'JavaPete', '15' ", ... }
  }

 void validate() {
      for (String method : validationMap.keys) {
           for (Field field : validationMap.get(method) ) {
                 invoke(method, field);
           }
      }
  }

 void notNull(Field field) {
     if (field.getValue() == "") {
          validationErrors.add(field.getFieldName(), "Can't be null!");
     }
  }

请注意,我没有在 Maps 中正确添加每个 Set<> 属性,但这只是为了说明一点。

这会是一个有效的解决方案吗?强大的?

于 2010-05-10T11:10:14.357 回答