我已经为我的项目启用了 spring mvc 注释驱动。这个想法是将 @Valid
注释与 spring 注释一起使用,以避免 Controller 中的行,例如:
validator.validate(表单,错误)
我注意到这个东西不适用于包中的 spring 注释:
org.springmodules.validation.bean.conf.loader.annotation.handle
经过调查,我发现我可以使用 javax
或 org.hibernate.validator.constraints
中的注释作为替代方式。
但不幸的是,我有一些特殊情况无法实现这一点:
@MinSize(applyIf = "name NOT EQUALS 'default'", value = 1)
很高兴知道 Spring 注解可以以何种方式与 @Valid 或任何其他替代方式一起使用,以避免与 applyIf
属性相关的重构(将条件移至 java 代码)。
最佳答案
以下是如何创建自定义 validator 的示例。
首先创建您自己的注释:
@Target({ ElementType.METHOD, ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = StringValidator.class)
public @interface ValidString {
String message() default "Invalid data";
int min() default -1;
int max() default -1;
String regex() default "";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
那么您将需要一个自定义 validator :
public class StringValidator implements ConstraintValidator<ValidString, String> {
private int _min;
private int _max;
private String _regex;
private boolean _decode;
public void initialize(ValidString constraintAnnotation) {
_min = constraintAnnotation.min();
_max = constraintAnnotation.max();
_regex = constraintAnnotation.regex();
_decode = constraintAnnotation.decode();
}
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return false;
}
String test = value.trim();
if (_min >= 0) {
if (test.length() < _min) {
return false;
}
}
if (_max > 0) {
if (test.length() > _max) {
return false;
}
}
if (_regex != null && !_regex.isEmpty()) {
if (!test.matches(_regex)) {
return false;
}
}
return true;
}
}
最后您可以在 Beans 和 Controller 中使用它:
public class UserForm {
@ValidString(min=4, max=20, regex="^[a-z0-9]+")
private String name;
//...
}
// Method from Controller
@RequestMapping(method = RequestMethod.POST)
public String saveUser(@Valid UserForm form, BindingResult brResult) {
if (brResult.hasErrors()) {
//TODO:
}
return "somepage";
}
关于java - @Valid 带有 spring 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24935893/