使用 OVal 验证框架 (http://oval.sourceforge.net/),可以创建自定义注释或基于 XML 的约束 (http://oval.sourceforge.net/userguide.html#d4e493)。
我的目的是从一些约束定义中生成一个 OVal XML 配置文件,这就是为什么我想使用 XML 配置 (http://oval.sourceforge.net/userguide.html#d4e551) 来完成完整的 OVal 约束定义。
我想验证一个类(Attend)的某个方法(getDomain)的返回值,我必须为我的自定义检查类的 isSatisfied 方法添加额外的值(六个字符串)。
到目前为止,我的 XML 配置如下所示:
<class type="my.package.Attend"
overwrite="false" applyFieldConstraintsToSetter="true">
<field name="NAME">
<notNull />
<maxLength max="4" />
</field>
<method name="getDomain">
<returnValue>
<my.package.DomainCheck />
</returnValue>
</method>
</class>
我有一个检查器类 DomainCheck 应该从 getDomain 方法接收返回值。在 DomainCheck 的 isSatisfied 方法中,我必须使用必须在 XML 中以某种方式配置的一些附加参数来验证返回值。
我的第一个问题是,没有调用 DomainCheck 的 isSatisfied 方法。如果我删除方法约束,验证结果是无效的,因为我期望它来自字段约束。但是如果我添加方法约束,则不会调用 DomainCheck 并且验证结果有效(应该仍然无效)。我看不出为什么不调用自定义检查。我的方法约束定义一定有问题。这是我的自定义检查类和相应的接口:
package my.package;
import ...
public class DomainCheck extends AbstractAnnotationCheck<Domain> {
public boolean isSatisfied(Object validatedObject, Object valueToValidate, OValContext context, Validator validator) {
if (valueToValidate == null) {
return true;
}
List<?> domainMembers = (ArrayList<?>) valueToValidate;
for (Object domainMember : domainMembers) {
// do validation
}
return false
}
}
package my.package;
import ...
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@net.sf.oval.configuration.annotation.Constraint(checkWith = DomainCheck.class)
public @interface Domain {
String message() default "must be conform to ...";
}
如果这可行,我的第二个问题是配置附加参数。我想到了类似的东西:
<method name="getDomain">
<returnValue>
<my.package.DomainCheck />
</returnValue>
<parameter type="java.lang.String">OneName</parameter>
<parameter type="java.lang.String">AnotherName</parameter>
<parameter type="java.lang.String">0</parameter>
<parameter type="java.lang.String">*</parameter>
<parameter type="java.lang.String">5</parameter>
<parameter type="java.lang.String">100</parameter>
</method>
上面的语法用于定义方法签名的约束,所以这显然不起作用。但是我找不到任何可能的定义来达到我的目的。
那么,为什么我的自定义检查没有被调用,如果有解决方案,如何在 XML 配置中为 isSatisfied 方法定义其他参数,以及如何在 isSatisfied 方法中访问它们?
提前感谢您的任何建议!干杯大卫