0

使用 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 方法中访问它们?

提前感谢您的任何建议!干杯大卫

4

1 回答 1

1

您正在尝试在此处使用按合同进行编程的功能。为此,您需要进行一些额外的准备工作:http: //oval.sourceforge.net/userguide.html#project-preparation

于 2012-07-15T00:27:28.233 回答