Как добавить дополнительный контекст / значения для пользовательского ограничения метода на основе 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