【问题标题】:Enabling Bean Validation 2.0?启用 Bean 验证 2.0?
【发布时间】:2019-02-04 20:20:12
【问题描述】:

我试图按照下面文章中的说明尝试实现一个简单的注释,只是为了测试一个字符串是否具有一定的长度作为测试。我的目标是,如果 String 不满足某些条件,则让此注释在运行时引发异常。

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

我能够将注释添加到代码中,并且一切都可以编译和构建。但是,无论我在尝试从单元测试中调用它时做什么,我都无法运行验证。我觉得我错过了一些明显的东西,但我不知道它是什么。请注意,这是一个 Java SE 后端服务,因此没有 UI 组件。让我们举个例子(我知道已经存在检查字符串是空还是空)

界面如下:

@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"
}

如果我从单元测试中调用它,即使字符串为空或为空,验证也不会运行。任何帮助将不胜感激!

【问题讨论】:

  • 您是否还可以添加您希望进行验证的代码部分。那会很有帮助。
  • 嗨,马克也许这就是我的知识差距所在。让我用一个具体的例子。我正在通过创建一个“NotEmpty”验证来测试它,它所做的只是测试一个字符串是否为空或空(我知道已经存在类似的东西,但让我们以此为例)我将使用代码编辑上面的示例但是当我在我的代码中使用@NotEmpty 时,它会编译,但在运行单元测试并传递一个空字符串时实际上并没有发生验证。我觉得这里缺少一些明显的东西..

标签: java annotations bean-validation


【解决方案1】:

如果我理解正确,您希望在以类似于此示例的方式调用 testAnnotation() 方法时收到验证异常:

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

如果是这样,那么问题是验证不会发生,而是它本身。您要么需要在某些 bean 上显式执行验证:

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 with CDI,或使用Spring

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多