精华内容
下载资源
问答
  • JSR303数据校验

    2021-10-02 14:28:07
    Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心...@Validated //数据校验 public class Person { @Email(message="邮箱格式错误") //name必须是邮箱格式 private String na

    Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式;

    @Component //注册bean
    @ConfigurationProperties(prefix = "person")
    @Validated  //数据校验
    public class Person {
    
        @Email(message="邮箱格式错误") //name必须是邮箱格式
        private String name;
    }
    

    常见参数

    @NotNull(message="名字不能为空")
    private String userName;
    @Max(value=120,message="年龄最大不能查过120")
    private int age;
    @Email(message="邮箱格式错误")
    private String email;
    
    空检查
    @Null       验证对象是否为null
    @NotNull    验证对象是否不为null, 无法查检长度为0的字符串
    @NotBlank   检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
    @NotEmpty   检查约束元素是否为NULL或者是EMPTY.
        
    Booelan检查
    @AssertTrue     验证 Boolean 对象是否为 true  
    @AssertFalse    验证 Boolean 对象是否为 false  
        
    长度检查
    @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
    @Length(min=, max=) string is between min and max included.
    
    日期检查
    @Past       验证 DateCalendar 对象是否在当前时间之前  
    @Future     验证 DateCalendar 对象是否在当前时间之后  
    @Pattern    验证 String 对象是否符合正则表达式的规则
    
    @Email(regexp=正则表达式,flag=标志的模式)	CharSequence子类型(如String)	验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式
    @Pattern(regexp=正则表达式,flag=标志的模式)	String,任何CharSequence的子类型	验证注解的元素值与指定的正则表达式匹配
    
    ...等等
    
    
    展开全文
  • Spring - JSR303数据校验

    2020-05-14 16:00:12
    在做项目的时候需要对表单的值进行校验,只有校验通过才能提交,一般来说前端和后端都需要做校验JSR303是做后端校验的一种方式。 JSR303简介 JSR是Java Specification Requests的缩写,意思是Java 规范提案。是...

    在做项目的时候需要对表单的值进行校验,只有校验通过才能提交,一般来说前端和后端都需要做校验,JSR303是做后端校验的一种方式。

    JSR303简介

    JSRJava Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务,JSR已成为Java界的一个重要标准。
    JSR-303JAVA EE 6 中的一项子规范,叫做Bean ValidationHibernate ValidatorBean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的实现,除此之外还有一些附加的 constraint

    一、Bean Validation 中内置的 constraint

    在这里插入图片描述

    二、Hibernate Validator 附加的 constraint

    在这里插入图片描述
    更多的constraint请见百度。

    JSR303的使用

    下文需要的基础返回类型 - R
    public class R extends HashMap<String, Object> {
    	private static final long serialVersionUID = 1L;
    	
    	public R() {
    		put("code", 0);
    		put("msg", "success");
    	}
    	
    	public static R error() {
    		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
    	}
    	
    	public static R error(String msg) {
    		return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
    	}
    	
    	public static R error(int code, String msg) {
    		R r = new R();
    		r.put("code", code);
    		r.put("msg", msg);
    		return r;
    	}
    
    	public static R ok(String msg) {
    		R r = new R();
    		r.put("msg", msg);
    		return r;
    	}
    	
    	public static R ok(Map<String, Object> map) {
    		R r = new R();
    		r.putAll(map);
    		return r;
    	}
    	
    	public static R ok() {
    		return new R();
    	}
    
    	public R put(String key, Object value) {
    		super.put(key, value);
    		return this;
    	}
    }
    

    一、常规使用

    1、标注校验注解

    给Bean添加校验注解:javax.validation.constraints,并定义自己的message提示。

    // Brand对象里的属性
    @NotBlank(message = "品牌名至少包含一个非空字符")
    private String name;  // 品牌名
    
    @NotNull(message = "必须指定品牌Id")
    private Long id;      // 品牌id
    
    @URL(message = "logo必须是一个合法的url地址")       // URL校验
    private String logo;  // 品牌logo的url
    
    @NotEmpty
    @Pattern(regexp = "^[a-zA-Z]", message = "检索首字母必须是一个字母")   // 正则校验
    Private String firstLetter;   // 品牌首字母,如小米就是X
    
    @NotNull
    @Min(value = 0, message = "排序必须大于等于0")
    private Integer sort;        // 排序字段
    
    2、开启校验功能

    在需要校验的对象前添加@Valid注解开启校验功能,在被校验的对象之后添加BindingResult对象可以获取校验结果。

    // Controller层,返回的是JSON数据(即@RestController)
    @RequestMapping("/save")
    public R save(@Valid @RequestBody Brand brand, BindingResult result){
    	if(result.hasErrors()){   // 获取校验的错误结果
    		Map<String, String> resultMap = new HashMap<>();
    		result.getFieldErrors().forEach((item) -> {
    			// 获取错误的校验消息
    			String message = item.getDefaultMessage();
    			// 获取错误的属性名
    			String field = item.getField();
    			resultMap.put(field,message);
    		});
    		return R.error(400,"提交的数据不合法").put("data",map);
    	}
    	// 正常保存 - 调用Service层进行保存
    	brandService.save(brand);
    	return R.ok();
    }
    

    3、全局异常处理

    上面的步骤已经完成了基本校验,但是有点复杂,需要在Controller方法里添加重复代码。
    错误需要返回一个错误码及错误消息,因此使用一个枚举类型来定义,然后这种方式也挺适合项目里使用。

    /***
     * 错误码和错误信息定义类
     * 1. 错误码定义规则为5为数字
     * 2. 前两位表示业务场景,最后三位表示错误码。例如:100001。10:通用 001:系统未知异常
     * 3. 维护错误码后需要维护错误描述,将他们定义为枚举形式
     * 错误码列表:
     *  10: 通用
     *      001:参数格式校验
     *  11: 商品
     *  12: 订单
     *  13: 购物车
     *  14: 物流
     */
    public enum BizCodeEnum {
        UNKNOW_EXCEPTION(10000,"系统未知异常"),
        VAILD_EXCEPTION(10001,"参数格式校验失败");
    
        private int code;
        private String msg;
        BizCodeEnum(int code,String msg){
            this.code = code;
            this.msg = msg;
        }
    
        public int getCode() {
            return code;
        }
    
        public String getMsg() {
            return msg;
        }
    }
    
    

    处理全局异常 - 处理校验错误异常:

    @Slf4j
    @RestControllerAdvice(basePackages = "top.liuchengyin.product.controller")
    public class ExceptionControllerAdice {
    	@ExceptionHandler(value = MethodArgumentNotValidException.class)
    	 public R handleVaildException(MethodArgumentNotValidException e){
            log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
            // 获取错误结果
            BindingResult bindingResult = e.getBindingResult();
            Map<String,String> errorMap = new HashMap<>();
            bindingResult.getFieldErrors().forEach((fieldError)->{
                errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
            });
            // 返回错误信息
            return R.error(BizCodeEnum.VAILD_EXCEPTION.getCode(),BizCodeEnum.VAILD_EXCEPTION.getMsg()).put("data",errorMap);
        }
    }
    

    这样,Controller层的代码就变得十分简略了:

    @RequestMapping("/save")
    public R save(@Valid @RequestBody Brand brand){
    	brandService.save(brand);
    	return R.ok();
    }
    

    二、分组校验

    分组校验用于多场景的复杂校验,比如说我们在做新增功能的时候,这是不需要校验ID的(ID是自动生成的),但是做修改的时候就需要校验ID了(没有ID,就没办法判断修改的谁)。也就是说,给校验注解标注什么情况需要进行校验。

    1、创建分组标识

    分组标识是一个空的接口即可,只是用来标识是那种情况。这里创建两个标识表示:新增、修改。

    // 修改分组标识
    public interface UpdateGroup {
    
    }
    
    // 新增分组标识
    public interface AddGroup {
    
    }
    
    2、在Bean中添加分组
    // Brand对象
    @NotNull(message = "修改必须指定品牌id",groups = {UpdateGroup.class})
    @Null(message = "新增不能指定id",groups = {AddGroup.class})
    private Long brandId;      // 品牌ID
    
    @NotBlank(message = "品牌名必须提交",groups = {AddGroup.class,UpdateGroup.class})
    private String name;	 // 品牌名
    
    @NotBlank(groups = {AddGroup.class})
    @URL(message = "logo必须是一个合法的url地址",groups={AddGroup.class,UpdateGroup.class})
    private String logo;     // logo的url地址
    
    3、在Controller方法中指定分组

    注意:上面的Bean中,如果@NotBlank没有指定分组的话,那么在分组校验@Validated({AddGroup.class})的情况下是不会生效的,只会在@Validated生效,因此需要指定分组。即默认没有指定分组的校验注解在有分组注解Vlaidated指定分组时不会生效。

    @RequestMapping("/save")
    public R save(@Validated({AddGroup.class}) @RequestBody Brand brand){
    	brandService.save(brand);
    	return R.ok();
    }
    
    @RequestMapping("/update")
    public R update(@Validated(UpdateGroup.class) @RequestBody Brand brand){
    	brandService.updateDetail(brand);
    	return R.ok();
    }
    

    三、自定义校验

    上面的校验可能有时候满足不了我们的需求,因此我们也可以自己自定义一个校验注解,编写一个校验器进行关联。

    1、引入依赖
    <!-- 校验 -->
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>2.0.1.Final</version>
    </dependency>
    
    2、Bean上加入自定义校验注解
    @ListValue(vals={0,1},groups = {AddGroup.class, UpdateGroup.class})
    private Integer showStatus;
    
    3、编写自定义校验注解
    @Documented
    // 指定自定义校验器,可以指定多个类型的,使用逗号隔开
    @Constraint(validatedBy = { ListValueConstraintValidator.class })   
    @Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
    @Retention(RUNTIME)
    public @interface ListValue {
    	// 错误信息默认会从配置文件中获取即下面的top.xxxx的值(自定义的)
        String message() default "{top.liuchengyin.product.valid.ListValue.message}";
    
        Class<?>[] groups() default { };
    
        Class<? extends Payload>[] payload() default { };
    
        int[] vals() default { };   // 对应注解中的vals
    }
    
    4、编写自定义校验器

    自定义校验器,需要实现ConstraintValidator接口。

    // ConstraintValidator<校验注解,类型>
    public class ListValueConstraintValidator implements ConstraintValidator<ListValue,Integer> {
        private Set<Integer> set = new HashSet<>();
        // 初始化方法
        @Override
        public void initialize(ListValue constraintAnnotation) {
            // 取出注解中的值,放入Set
            int[] vals = constraintAnnotation.vals();
            for (int val : vals) {
                set.add(val);
            }
    
        }
        
        /**
         * 判断是否校验成功
         * @param value 需要校验的值
         */
        @Override
        public boolean isValid(Integer value, ConstraintValidatorContext context) {
            return set.contains(value);
        }
    }
    
    展开全文
  • SpringMVC使用jsr303进行数据校验 1.首先,在pom中引入jsr303的依赖。 <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> ...

    SpringMVC使用jsr303进行数据校验

    1.首先,在pom中引入jsr303的依赖。

    <dependency>
          <groupId>org.hibernate.validator</groupId>
          <artifactId>hibernate-validator</artifactId>
          <version>6.1.6.Final</version>
    </dependency>
    

    2.我们需要在需要校验的数据对象前加上@Valid注解,表示我们需要springmvc帮助我们校验这个对象。我的是校验ProductFrom这个类的对象。

    @GetMapping("/productAdd")
    @ResponseBody
    public String addProduct(@Valid ProductForm productForm){
    ...
    }
    

    3.在类的成员变量上加上注解说明校验规则。
    常用的校验规则如下:
    空检查
    @Null 验证对象是否为null
    @NotNull 验证对象是否不为null, 无法查检长度为0的字符串
    @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
    @NotEmpty 检查约束元素是否为NULL或者是EMPTY.

    Booelan检查
    @AssertTrue 验证 Boolean 对象是否为 true
    @AssertFalse 验证 Boolean 对象是否为 false

    长度检查
    @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
    @Length(min=, max=) Validates that the annotated string is between min and max included.

    日期检查
    @Past 验证 Date 和 Calendar 对象是否在当前时间之前,验证成立的话被注释的元素一定是一个过去的日期
    @Future 验证 Date 和 Calendar 对象是否在当前时间之后 ,验证成立的话被注释的元素一定是一个将来的日期
    @Pattern 验证 String 对象是否符合正则表达式的规则,被注释的元素符合制定的正则表达式,regexp:正则表达式 flags: 指定 Pattern.Flag 的数组,表示正则表达式的相关选项。

    数值检查
    建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为”“,Integer为null
    @Min 验证 Number 和 String 对象是否大等于指定的值
    @Max 验证 Number 和 String 对象是否小等于指定的值
    @DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
    @DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
    @Digits 验证 Number 和 String 的构成是否合法
    @Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
    @Range(min=, max=) 被指定的元素必须在合适的范围内
    @Range(min=10000,max=50000,message=”range.bean.wage”)
    @Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
    @CreditCardNumber信用卡验证
    @Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。

    我的代码实例:

    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.NotNull;
    import java.math.BigDecimal;
    
    public class ProductForm {
    
        @NotNull(message = "分类id不能为空")
        private Integer categoryId;
    
        @NotBlank(message = "商品名不能为空或空字符串")
        private String name;
    
        @NotBlank(message = "主图不能为空")
        private String mainImage;
    
        @NotBlank(message = "详情不能为空")
        private String subImages;
    
        @NotBlank(message = "描述不能为空")
        private String detail;
    
        @NotNull
        @Min(value = 0,message = "价格不能小于0")
        private BigDecimal price;
    
        @NotNull
        @Min(value = 0,message = "库存不能小于0")
        private Integer stock;
    	
    	#Set and Get
    	...
        }
    

    这里面的message可以自定义不符合校验规则的错误信息,不写的话会有默认值,但是默认值说的含糊不清,建议自己修改。
    4.既然springmvc已经给我们校验过数据了,那么他怎么把校验后的信息回馈给我们呢。这就用到BindingResult这个对象了。在controller层传参的时候,在@valid注解标注的对象后面加上BindingResult的对象。下面是我的实例:

    @GetMapping("/productAdd")
    @ResponseBody
    public String addProduct(@Valid ProductForm productForm, BindingResult bindingResult){
    		if(bindingResult.hasErrors()){
                return bindingResult.getAllErrors().get(0).getDefaultMessage();
            }
    
            return "success";
    

    使用bindingResult.hasErrors来判断是否有错误,bindingResult.getAllErrors().get(0).getDefaultMessage()用来输出错误信息。

    本人也是正在学习,是一个java初学者,如果我说的有什么问题,请大佬们多多指教。谢谢啦

    展开全文
  • 内容来源 kuang study, 誊写仅用于学习 Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便...@Validated //数据校验 public class Person { @Email(message="邮箱格式错误") //name必.

    内容来源 kuang study, 誊写仅用于学习

    Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。我们这里来写个注解让我们的name只能支持Email格式;

    @Component //注册bean
    @ConfigurationProperties(prefix = "person")
    @Validated  //数据校验
    public class Person {
    
        @Email(message="邮箱格式错误") //name必须是邮箱格式
        private String name;
    }
    

    如果@Email注解爆红的话需要去导入一下依赖

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    

    运行结果 :报错
    在这里插入图片描述
    使用数据校验,可以保证数据的正确性;

    常见参数

    @NotNull(message="名字不能为空")
    private String userName;
    @Max(value=120,message="年龄最大不能查过120")
    private int age;
    @Email(message="邮箱格式错误")
    private String email;
    
    空检查
    @Null       验证对象是否为null
    @NotNull    验证对象是否不为null, 无法查检长度为0的字符串
    @NotBlank   检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
    @NotEmpty   检查约束元素是否为NULL或者是EMPTY.
        
    Booelan检查
    @AssertTrue     验证 Boolean 对象是否为 true  
    @AssertFalse    验证 Boolean 对象是否为 false  
        
    长度检查
    @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内  
    @Length(min=, max=) string is between min and max included.
    
    日期检查
    @Past       验证 Date 和 Calendar 对象是否在当前时间之前  
    @Future     验证 Date 和 Calendar 对象是否在当前时间之后  
    @Pattern    验证 String 对象是否符合正则表达式的规则
    

    …等等
    除此以外,我们还可以自定义一些数据校验规则

    展开全文
  • 这个是用来引入对jsr303注解的支持。 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>...
  • 文章目录前言一、校验数据案例二、validated类2.1、空检查:2.2、Boelan检查:2.3、长度检查:2.4、日期检查:2.5、数值检查: 前言 我使用的SpringBoot版本是2.4.4,理论上其spring-boot-starter-web模块里面会...
  • JSR303数据校验和所需依赖

    千次阅读 2020-07-22 13:19:53
    粗略的记录下JSR303数据校验: 简介: JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation。 在任何时候,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过某种...
  • 1、Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,并指出错位位置及出错类型,方便异常中心统一处理。 2、@validated作用于类上,@Email()作用于属性上 3、其中包含的数据类型有很多,...
  • JSR303 数据校验

    2020-08-05 23:31:53
    JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界...
  • Springboot中可以用@validated注解来开启校验数据,如果数据异常则会统一抛出异常,方便异常中心...@Validated //数据校验 public class students{ @Email(message="邮箱格式错误") //name必须是邮箱格式 private St
  • 2.在使用JSR303注解时添加group属性 3.在添加及编辑操作时使用@Validated注解并指定其value值 注意:由于注解指定了value值,所以该注解只会校验group为该类型的属性值,所以没有指定group的属性值不会被...
  • SpringMVC JSR303数据校验DEMO(附:JSR303的JAR包) SpringMVC JSR303数据校验DEMO(附:JSR303的JAR包)
  • 主要介绍了Java如何使用JSR303校验数据与自定义校验注解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation<...数据约束实体类代码BrandEntity.java package c..
  • JSR303数据校验功能

    2021-05-31 12:50:28
    JSR303数据校验实战 例如:JSR303数据校验功能学习 文章目录JSR303数据校验实战一、JSR303数据校验是什么?二、JSR303数据校验使用步骤1.引入库2.实体类上加校验注解3.JSR分组校验功能:1.应用场景:2.分组校验...
  • 在某些特殊的业务中,现有的校验法则可能会满足不了需求,例如我期望有一个注解校验前端传过来的参数是1或者0的其中一个,若是传其他的则会校验失败,这时候就需要自己自定义校验规则,下面是JSR303的自定义校验规则...
  • SpringMVC_JSR303数据校验

    2020-08-12 01:19:41
    JSR303数据校验如何校验 ①使用JSR 303验证标准 ②加入hibernate validator验证框架 ③在SpringMVC配置文件中增加mvc:annotation-driven/ ④需要在bean的属性上增加对应验证的注解 ⑤在目标方法bean类型的前面增加@...
  • JSR303 数据校验 和 顺序校验
  • JSR303数据校验需要的maven <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> </dependency> <!-- ...
  • } //数据校验异常 @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseBody public R error(MethodArgumentNotValidException e){ e.printStackTrace(); List fieldErrors = e.getBindingResult()...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,856
精华内容 4,342
关键字:

jsr303数据校验