我试图遵循下面文章中的说明,试图实施一个简单的批注,只是为了测试字符串是否为特定长度。我的目标是,如果String不满足某些条件,则在运行时将此注释引发异常。
https://dzone.com/articles/create-your-own-constraint-with-bean-validation-20
我能够将注释添加到代码中,并且一切都可以编译和构建。但是,无论我尝试从单元测试中调用它时做什么,都无法运行验证。我觉得我缺少明显的东西,但我不知道它是什么。请注意,这是Java SE后端服务,因此没有UI组件。让我们举个例子(我知道已经存在检查String是否为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 {};
}
这里是验证者:
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或为空,我也从单元测试中调用它,则验证不会运行。任何帮助将不胜感激!
答案 0 :(得分:0)
如果我对它的理解正确,那么您希望以类似于以下示例的方式调用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验证不支持静态方法,但是在非静态方法的情况下,您将需要再次手动运行验证:
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。