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メソッドに追加の値(6つの文字列)を追加する必要があります。

これまでの私の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>

getDomainメソッドから戻り値を受け取るチェッカークラスDomainCheckがあります。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 ...";
}

これが機能する場合、私の2番目の問題は追加のパラメーターを構成することです。私は次のようなことを考えました:

    <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 に答える