JSR-303常用注解-参数校验

【JSR-303】常用注解及其使用场景、注意事项

一、JSR-303简介:

JSR-303是 JAVA EE 6 中的一项子规范,主要用于后端对前端传过来的参数做一些规则性校验,它以注解的方式来解决日常开发中的参数校验问题。

二、Maven依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>springboot项目不需要填写,它会根据springboot版本自动适配</version>
</dependency>

三、使用场景

注解名称注解作用说明
@NotNull主要用于对象的校验,校验对象不能为null,无法检查长度为0的字符串
@NotBlank用于String类型参数校验,检查字符串不能为null且trim()之后的size>0
@NotEmpty主要用于集合校验,校验集合不能为null且不能size>0,也可以用于String的校验
@Size用于对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Range控制一个数值的范围
@Length用于String对象的大小必须在指定的范围内
@Pattern用于String对象是否符合正则表达式的规则
@Email用于String对象是否符合邮箱格式
@Min用于Number和String对象是否大等于指定的值
@Max用于Number和String对象是否小等于指定的值
@AssertTrue用于Boolean对象是否为true
@AssertFalse用于Boolean对象是否为false

四、JSR-303扩展之LIstValue

1、编写自定义的校验器,开始编写这个注解对应的校验器,也就是真正的让注解产生作用的类,这个类首先实现校验器,泛型就是这个注解和注解中定义的参数值的类型。

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

//编写自定义的校验器
public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {

    private Set<Integer> set=new HashSet<Integer>();

    //初始化方法
    @Override
    public void initialize(ListValue constraintAnnotation) {
        @Override
    	public void initialize(ListValue constraintAnnotation) {
        	for (int i : constraintAnnotation.vals()) {
            	set.add(i);
        	}
    	}

    /**
     * 判断是否校验成功
     * @param value  需要校验的值
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        return  set.contains(value);
    }
}

2、 编写注解,参考其他的注解,把必须要有的都拷贝进来。

@Documented
@Constraint(validatedBy = { ListValueConstraintValidator.class })
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
public @interface ListValue {
    // 使用该属性去Validation.properties中取
    String message() default "{com.znan.common.valid.ListValue.message}";

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

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

    int[] vals() default {};

}

3、在web项目的Dto中加上自定义的注解,然后在Controller控制器上的请求方法的参数前加上@Valid或@Validated即可。

package com.znan.webmvc.Dto;

import com.znan.webmvc.annotation.ListValue;
import com.znan.webmvc.po.Dog;
import lombok.Data;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.List;

@Data
public class PersonReqDto {

    @NotNull(message = "id不能为空")
    private Integer id;

    @NotBlank(message = "用户名不能为空")
    private String userName;

    @ListValue(vals = {1, 2}, message = "sex的值有误")
    private Integer sex;

    @NotEmpty
    private List<Dog> dogList;
}
package com.znan.webmvc.controller;

import com.znan.webmvc.Dto.PersonReqDto;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
@RequestMapping("/persons")
public class PersonController {

    @PostMapping
    public void add(@Valid @RequestBody PersonReqDto reqDto){
        System.out.println("........");
    }
}

四、注意事项

String类型的参数不要使用@NotNull做检验,因为校验不会生效。

如果在Dto中加了上述的注解,需要在控制器Controller中加入@Valid或@Validated注解,这样校验才会生效。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值