Java 启用Bean验证2.0?

Java 启用Bean验证2.0?,java,annotations,bean-validation,Java,Annotations,Bean Validation,我试图按照下面文章中的说明来实现一个简单的注释,只是为了测试字符串是否有一定的长度。我的目标是,如果字符串不满足某些条件,则让此注释在运行时引发异常 我能够将注释添加到代码中,所有内容都可以很好地编译和构建。然而,当我试图从单元测试调用它时,无论我做什么,我都无法运行验证。我觉得我错过了一些明显的东西,但我不知道是什么。请注意,这是一个JavaSE后端服务,因此没有UI组件。让我们举一个例子(我知道已经存在检查字符串是否为null或空的例子) 以下是界面: @Documented @Const

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

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

以下是界面:

@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 {};
}

如果我从单元测试调用它,即使字符串为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.
}
public void doValidationManually(){
Validator Validator=Validation.byDefaultProvider()
.configure()
.buildValidatorFactory()
.getValidator();
MyObj=新的MyObj();
//还有一些初始化。。。
设置冲突=validator.validate(obj);
//根据一系列违规行为做出任何决策。
}
验证程序可以在方法外部初始化,而不是每次需要验证时都创建

在验证方法参数的情况下,Bean验证不支持静态方法,但在非静态方法的情况下,您需要再次手动运行验证:

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.
}
public void doMethodValidationManually()抛出NoSuchMethodException{
ExecutableValidator validator=Validation.byDefaultProvider()
.configure()
.buildValidatorFactory()
.getValidator().forExecutables();
方法testAnnotationMethod=MyObj.class.getDeclaredMethod(“testAnnotation”,String.class);
MyObj=新的MyObj();
设置冲突=validator.validateParameters(
obj,//预期对其调用方法的对象
testAnnotationMethod,//要验证哪些参数的方法
新对象[]{”“}//我们希望传递给方法的参数数组
);
//根据一系列违规行为做出任何决策。
}

或者,您应该在容器中运行代码,在这种情况下,容器将自动委托并执行对方法的验证。有关这方面的更多信息,请参阅或使用。

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