java - @Valid 带有 spring 注解

标签 java spring validation

我已经为我的项目启用了 spring mvc 注释驱动。这个想法是将 @Valid 注释与 spring 注释一起使用,以避免 Controller 中的行,例如: validator.validate(表单,错误)

我注意到这个东西不适用于包中的 spring 注释:

org.springmodules.validation.bean.conf.loader.annotation.handle

经过调查,我发现我可以使用 javaxorg.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/

相关文章:

java - 如何使用 oAuth2/spring security 限制一个连接/用户

java - 如何在不嵌套的情况下在 lambda 中链接 Optional#ifPresent()?

java - 如何在spring mvc中删除session属性

java - 哪个是 Spring 4 支持的最低 Java 版本

Python 3 正则表达式搜索重复字符功能不起作用

php - Laravel:模型内验证。多重验证规则

java - JDO 的 jpox 和 data core 实现有什么不同?

java - Spring数据Elasticsearch |通过存储库进行全文本搜索

java - Apache Commons 配置验证属性文件

java - 使Jackson在序列化时不输出类名(使用Spring MVC)