Как добавить дополнительный контекст / значения для пользовательского ограничения метода на основе XML с помощью инфраструктуры проверки OVal

С помощью инфраструктуры проверки OVal (http://oval.sourceforge.net/) можно создавать собственные аннотации или ограничения на основе XML (http://oval.sourceforge.net/userguide.html#d4e493).

Мое намерение состоит в том, чтобы создать файл конфигурации OVal XML из некоторых определений ограничений, поэтому я хотел бы сделать полное определение ограничения OVal с помощью конфигурации XML (http://oval.sourceforge.net/userguide.html#d4e551).

Я хотел бы проверить возвращаемое значение определенного метода (getDomain) класса (Attend), и мне нужно добавить дополнительные значения (шесть строк) для метода 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. В методе isSatisfied DomainCheck я должен проверить возвращаемое значение с некоторыми дополнительными параметрами, которые мне нужно как-то настроить в XML.

Моя первая проблема заключается в том, что isSatisfied метод DomainCheck не вызывается. Если я удаляю ограничение метода, результат проверки будет недействительным, как я ожидаю от ограничения поля. Но если я добавлю ограничение метода, 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>

Приведенный выше синтаксис предназначен для определения ограничений для сигнатуры метода, поэтому это, очевидно, не работает. Но я не могу найти какое-либо возможное определение для моей цели.

Итак, почему моя пользовательская проверка не вызывается, и если есть решение для этого, как я могу определить дополнительные параметры для метода isSatisfied в конфигурации XML и как мне получить к ним доступ в методе isSatisfied?

Заранее благодарю за любой совет! Ура Дэвид

1 ответ

Вы пытаетесь использовать программирование по контракту здесь. Чтобы это работало, вам нужно выполнить некоторые дополнительные приготовления: http://oval.sourceforge.net/userguide.html

Другие вопросы по тегам