示例XML规则文档:
<user>
<username>
<not-null/>
<capitals value="false"/>
<max-length value="15"/>
</username>
<email>
<not-null/>
<isEmail/>
<max-length value="40"/>
</email>
</user>
我该如何实现?我从头开始,我目前拥有的是User-class,以及一个UserController,它将User对象保存在de DB中(通过Service-layer和Dao-layer),基本的Spring MVC。 我不能使用Spring MVC Validation,但是在我们的Model-classes中,我必须使用XML文档,以便Admin可以更改规则
我认为我需要一种基于XML Rules文档提供的动态构建算法的模式,但除了大量的if语句外,我似乎无法想到任何其他内容。
我还没有任何解析功能,而且我不确定我将如何(de)将其与验证过程的实际实现结合起来。
答案 0 :(得分:1)
这个轮子已经多次重新发明了!
您可能可以通过实现Spring的Validator接口来使用Spring MVC验证,但您可能需要实现或找到一种方法来验证通过其他方式加载的规则。
我googled并找到许多描述如何在Spring中使用公共验证的页面。作为奖励,一些人描述使用valang。如果您的管理员可以在部署之前编辑验证规则,则其中一个可能就足够了。
如果您真的想制作自行开发的XML业务规则,可能需要使用Apache Digester来解析规则。您可能希望将规则加载到您自己的Spring Validator接口实现所使用的数据结构中。
如果规则必须在部署后更改,您当然需要添加一种机制来刷新规则。但至少Digester仍然可能会帮助那里。
答案 1 :(得分: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!");
}
}
注意我没有添加每个Set&lt;&gt;地图中的属性是正确的,但这只是为了说明一点。
这是一个有效的解决方案吗?强健?