前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring boot系列——参数校验

Spring boot系列——参数校验

作者头像
大神带我来搬砖
发布2018-05-16 17:44:04
1.5K0
发布2018-05-16 17:44:04
举报
文章被收录于专栏:大神带我来搬砖

Spring boot开发web项目有时候我们需要对controller层传过来的参数进行一些基本的校验,比如非空、整数值的范围、字符串的长度、日期、邮箱等等。Spring支持JSR-303 Bean Validation API,可以方便的进行校验。

使用注解进行校验

先定义一个form的封装对象

代码语言:javascript
复制
class RequestForm {

    @Size(min = 1, max = 5)
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

其中name这个字段用Size注解限制长度1到5。Size是javax.validation包中的constraint注解。 在使用时用@Valid注解表示要校验这个bean。

代码语言:javascript
复制
    @ResponseBody
    @GetMapping(value = "bean")
    public String validate(@Valid RequestForm request) {
        System.out.println(request.getName());
        return "OK";
    }

自定义注解

如果内置的注解不够用,可以自定义注解。 比如先定义一个注解NameConstraint,限制name字段只能从特定数据中选取。

代码语言:javascript
复制
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NameConstraintValidator.class)
@interface NameConstraint {
    String[] allowedValues();

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    String message();
}

其中allowedValues表示合法的取值范围,message是校验失败的显示信息。 message、groups、payload是hibernate validator要求的字段,想了解的请看官方文档 再定义一个validator做真正的校验

代码语言:javascript
复制
class NameConstraintValidator implements ConstraintValidator<NameConstraint, String> {

    private String[] validValues;

    @Override
    public void initialize(NameConstraint constraintAnnotation) {
        validValues = constraintAnnotation.allowedValues();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        for (String s : this.validValues) {
            if (s.equals(value)) {
                return true;
            }
        }
        return false;
    }

}

在form bean中按如下方式使用

代码语言:javascript
复制
class RequestFormWithCustomConstraint {

    @NameConstraint(allowedValues = { "bar", "foo" }, message = "只允许bar,foo")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

直接校验参数

只有一个name字段,不想封装一个对象怎么办?可以直接校验该参数

代码语言:javascript
复制
@Controller
@Validated
@RequestMapping(value = "validator")
public class ParameterValidatorDemoController {

    @ResponseBody
    @GetMapping(value = "simple")
    public String validateParameter(@Size(min = 1, max = 5) String name) {
        System.out.println(name);
        return "OK";
    }

}

controller上面的@Validated注解则告诉spring需要扫描这个类,来检查其中的constraint注解。

详细信息可以参考官方文档有关章节 https://docs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-validation https://docs.spring.io/spring/docs/4.3.16.RELEASE/spring-framework-reference/htmlsingle/#validation-beanvalidation

代码在github https://github.com/kabike/spring-boot-demo

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.05.05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档