参数校验

目录

简述:

Spring的参数校验:

程序基本框架:

创建一个DTO对象:

Controller程序:

发起请求:

打印结果:

增加校验

@Validated 注解:

@Validated 和 @Valid 区别

增加参数校验注解:

java validation注解

hibernate validation 注解

在Bean上增加需要校验的设置

自定义validation注解

定义注解

校验的实现


简述:

   对于后台系统来讲,在入口处进行参数校验是非常必要的,这样可以减少后端的很多数据的判断,也可以减少大量的异常情况;

 

Spring的参数校验:

  一个好的参数校验方法:顶一个一个实体类来封装请求参数,使用Spring的@Validated,结合java validation,hibernate validation注解进行校验

 

程序基本框架:

先创建程序基本框架,将一个前端的请求,转换成DTO对象;

创建一个DTO对象:

public class testBO {
    /**
     * 姓名
     */
    private String name;

    /**
     * 性别
     */
    private String sex;

    /**
     * 年龄
     */
    private int age;

    /**
     * 体重
     */
    private float weight;

    ......

}

Controller程序:

@Controller
public class TestController1 {

    @RequestMapping( value = "/testbo")
    public Object test(ModelAndView mov , HttpServletRequest request,
                       testBO bo) {

        System.out.println(bo);

        ......

    }
}

发起请求:

http://localhost:8080/testbo?name=a1&age=10

打印结果:

 

 

增加校验

@Validated 注解:

在 Controller的参数前面,增加 @Validated 注解:

   import org.springframework.validation.annotation.Validated;
   ......


    @RequestMapping( value = "/testbo")
    public Object test(ModelAndView mov , HttpServletRequest request,
                       @Validated testBO bo) {

        System.out.println(bo);

        ......
    }

@Validated 和 @Valid 区别

         javax提供了一个 @Valid, 和 @Validated 有差别的;

        在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同。

 @Validated@Valid 
注解地方可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上可以用在方法、构造函数、方法参数和成员属性(字段)上两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能
分组提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,可参考高效使用hibernate-validator校验框架作为标准JSR-303规范,不支持分组的功能 
    

 

 

增加参数校验注解:

java validation注解

JSR提供的校验注解:         
@Null   被注释的元素必须为 null    
@NotNull    被注释的元素必须不为 null    
@AssertTrue     被注释的元素必须为 true    
@AssertFalse    被注释的元素必须为 false    
@Min(value)     被注释的元素必须是一个数字,其值必须大于等于指定的最小值    
@Max(value)     被注释的元素必须是一个数字,其值必须小于等于指定的最大值    
@DecimalMin(value)  被注释的元素必须是一个数字,其值必须大于等于指定的最小值    
@DecimalMax(value)  被注释的元素必须是一个数字,其值必须小于等于指定的最大值    
@Size(max=, min=)   被注释的元素的大小必须在指定的范围内    
@Digits (integer, fraction)     被注释的元素必须是一个数字,其值必须在可接受的范围内    
@Past    被注释的元素必须是一个过去的日期    
@Future  被注释的元素必须是一个将来的日期    
@Pattern(regex=,flag=)  被注释的元素必须符合指定的正则表达式

hibernate validation 注解

@Email    被注释的元素必须是电子邮箱地址    
@Length(min=,max=)  被注释的字符串的大小必须在指定的范围内    
@NotEmpty   被注释的字符串的必须非空    
@Range(min=,max=,message=)  被注释的元素必须在合适的范围内@URL(protocol=,host=,    port=, regexp=, flags=)  合法的url

主要区分下@NotNull  @NotEmpty  @NotBlank 3个注解的区别:

@NotNull           任何对象的value不能为null

@NotEmpty       集合对象的元素不为0,即集合不为空,也可以用于字符串不为null

@NotBlank        只能用于字符串不为null,并且字符串trim()以后length要大于0

 

在Bean上增加需要校验的设置

先增加2个属性的校验:

public class testBO {
    /**
     * 姓名
     */
    @NotNull
    private String name;

    /**
     * 性别
     */
    @Min(20)
    private String sex;

获取校验结果:

    @RequestMapping( value = "/testbo")
    public Object test(ModelAndView mov , HttpServletRequest request,
                       @Validated testBO bo, BindingResult bindingResult) {

        System.out.println( bindingResult.hasErrors());
        if( bindingResult.hasErrors()) {
            List<ObjectError> errors = bindingResult.getAllErrors();
            for( ObjectError err : errors) {
                System.out.println(err.toString());
            }
        }

发起同样的请求:

http://localhost:8080/testbo?name=a1&age=10

查看Error:

自定义validation注解

    有些时候,需要按照自己的业务规则进行校验,需要自定义校验规则;

定义注解

@Documented
@Constraint(validatedBy = DayOfWeekValidator.class)
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface DayOfWeek {
    String message() default "Unknown day of week";
    Class[] groups() default {};
    Class[] payload() default {};
}

校验的实现

public class DayOfWeekValidator implements ConstraintValidator<DayOfWeek, String> {

    private List<String> daysOfWeek =
            Arrays.asList("sunday", "monday", "tuesday", 
                          "wednesday", "thursday", "friday", "saturday");

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) return true; // can be null
        String input = value.trim().toLowerCase();
        if (daysOfWeek.contains(input)) {
            return true;
        }
        return false;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值