Включение проверки бина 2.0? - PullRequest
0 голосов
/ 30 августа 2018

Я пытался следовать инструкциям в статье ниже, пытаясь реализовать простую аннотацию, чтобы проверить, была ли строка определенной длины в качестве теста. Моя цель состояла в том, чтобы эта аннотация генерировала исключение во время выполнения, если строка не удовлетворяет определенным условиям.

https://dzone.com/articles/create-your-own-constraint-with-bean-validation-20

Я могу добавить аннотацию к коду, и все отлично компилируется и собирается. Однако, независимо от того, что я делаю, когда пытаюсь вызвать его из модульного теста, я не могу запустить проверку. Я чувствую, что упускаю что-то очевидное, но я не знаю, что это такое. Обратите внимание, что это серверная служба Java SE, поэтому нет компонента пользовательского интерфейса. Давайте рассмотрим пример (который, я знаю, уже существует, для проверки, является ли строка пустой или нулевой)

Вот интерфейс:

@Documented
@Constraint(validatedBy = {NotEmptyValidator.class})
@Target({METHOD, FIELD, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface NotEmpty {
    Class<?>[] groups() default {};
    String message() default "test message";
    Class<? extends Payload>[] payload() default {};
}

Вот валидатор:

public class NotEmptyValidator implements ConstraintValidator<NotEmpty, String> {

@Override
public void initialize(final NotEmpty notEmpty) {
}

@Override
public boolean isValid(String notEmptyField, ConstraintValidatorContext constraintValidatorContext) {
    return !Strings.isNullOrEmpty(notEmptyField);

}

}

Обратите внимание, что для хранения задано значение RUNTIME, но на самом деле оно не проверяется, когда я запускаю модульный тест для параметра String, который является пустой строкой. Как на самом деле включить эту проверку и запустить ее?

например, если у меня есть метод случайной полезности

public static String testAnnotation(@NotEmpty final String foo) {
    return foo + "bar"
}

Если я вызываю это из модульного теста, даже если строка пуста или пуста, проверка не запускается. Любая помощь будет оценена!

1 Ответ

0 голосов
/ 30 августа 2018

Если я правильно понимаю, вы ожидаете получить исключение проверки при вызове метода testAnnotation() способом, подобным этому примеру:

public void doThings(){
    // some code
    testAnnotation("");
    //no exception is thrown and code proceed to next statements...
    // more code
}

если это так, то проблема в том, что проверка не произойдет, а сама по себе. Вам либо нужно явно выполнить проверку для некоторого компонента:

public void doValidationManually() {
    Validator validator = Validation.byDefaultProvider()
            .configure()
            .buildValidatorFactory()
            .getValidator();

    MyObj obj = new MyObj();
    // some more initialization...

    Set<ConstraintViolation<MyObj>> violations = validator.validate( obj );

    // make any decisions based on the set of violations.
}

Валидатор можно инициализировать вне метода и не создавать каждый раз, когда требуется проверка.

В случае проверки параметров метода, Bean Validation не поддерживает статические методы, но в случае нестатического метода вам потребуется либо снова запустить проверку вручную:

public void doMethodValidationManually() throws NoSuchMethodException {
    ExecutableValidator validator = Validation.byDefaultProvider()
            .configure()
            .buildValidatorFactory()
            .getValidator().forExecutables();

    Method testAnnotationMethod = MyObj.class.getDeclaredMethod( "testAnnotation", String.class );

    MyObj obj = new MyObj();

    Set<ConstraintViolation<MyObj>> violations = validator.validateParameters(
            obj, // an object on which a method is expected to be called
            testAnnotationMethod, // the method which parameters we want to validate
            new Object[] { "" } // an array of parameters that we expect to pass to the method
    );

    // make any decisions based on the set of violations.
}

Или вы должны запускать свой код внутри контейнера, и в этом случае проверка ваших методов будет делегирована и автоматически выполнена контейнером. Для получения дополнительной информации см. Bean Validation с CDI или с использованием Spring .

...