启用Bean验证2.0?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启用Bean验证2.0?相关的知识,希望对你有一定的参考价值。

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

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

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

这是界面:

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

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

答案

如果我理解正确,当您以类似于此示例的方式调用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

以上是关于启用Bean验证2.0?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用符合 JAX-RS 2.0 的 RESTEasy 客户端 API 启用 NTLM 身份验证?

Java Bean Validation 2.0 Hibernate Validator - 带有外部 XML 配置的可执行 JAR

如何使用 SAML 2.0 响应进行特定 DNN 用户角色组身份验证和授权?

使用oVal进行Java Bean 验证的注意事项

JSF 2.0中的AJAX onSubmit验证

core1.1 升级到 2.0