摘要:参数校验代码见常规使用请求参数加上符合校验注解包括基本类型和自定义类。校验注解是在方法入参上,则需要在该方法所在的类上添加注解,在入参前或是在方法上添加启用校验注解都不生效。校验注解使用在方法入参上时,抛出的是异常。
JSR-303 参数校验
代码见validator-demo
1、常规使用1.1、请求参数加上符合JSR-303校验注解(包括基本类型和自定义类)。如果请求参数是自定义类,则在类的属性上加校验注解。
1.2、请求参数前面加上 @javax.validation.Valid 注解,或是 @org.springframework.validation.annotation.Validated 注解,告诉spring框架调用时进行参数校验。
1.3、校验注解是在方法入参上,则需要在该方法所在的类上添加 @org.springframework.validation.annotation.Validated 注解,在入参前或是在方法上添加启用校验注解都不生效。
1.4、如果请求参数列表中有 BindingResult,则springmvc框架不会向外抛异常,默认代码自行处理。
2、自定义注解2.1、创建自定义注解
import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; /** * 无敏感词校验注解 */ @Documented @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = NoSensitiveWordsValidator.class) public @interface NoSensitiveWords { String message() default "包含敏感词"; Class>[] groups() default {}; Class extends Payload>[] payload() default {}; }
2.2、自定义注解对应的校验类
import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.HashSet; import java.util.Set; /** * 敏感词校验逻辑 **/ public class NoSensitiveWordsValidator implements ConstraintValidator{ @Override public boolean isValid(String value, ConstraintValidatorContext context) { if (value == null || "".equals(value.trim())) { return true; } // 这里只简单举例校验 Set sensitiveWords = new HashSet<>(); sensitiveWords.add("毛泽东"); sensitiveWords.add("邓小平"); for (String word : sensitiveWords) { if (value.contains(word)) { return false; } } return true; } }
2.3、在类属性或方法入参上使用自定义注解
@Data public class Account { /** 昵称 */ @Length(min = 2, max = 20) @NoSensitiveWords private String nickName; }3、自定义异常
3.1、校验注解使用在实体参数上时,spring抛出的是org.springframework.web.bind.MethodArgumentNotValidException异常。
3.2、校验注解使用在方法入参上时,spring抛出的是javax.validation.ConstraintViolationException异常。
3.3、针对上述两种情况,可以做统一的拦截并封装成统一的系统异常
import lombok.extern.slf4j.Slf4j; import org.linbo.demo.validator.bean.HttpResult; import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.validation.ConstraintViolationException; import java.util.List; import java.util.stream.Collectors; @ControllerAdvice @ResponseBody @Slf4j public class DefaultExceptionHandler { @ExceptionHandler(value = {MethodArgumentNotValidException.class}) public HttpResult4、国际化校验异常信息
4.1、在resources目录下新增ValidationMessages.properties文件,英文为ValidationMessages_en.properties,中文为英文为ValidationMessages_zh_CN.properties,与标准国际化命名类型,都是ValidationMessages开头命令。
4.2、定义信息key和value
4.3、在自定义校验注解的String message() default "{properties中定义的key}"中,
或是在使用校验注解时(@Length(min = 2, max = 20, message = "{properties中定义的key}"))加入properties中定义的key。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75372.html
摘要:时间年月日星期三说明使用规范校验接口请求参数源码第一章理论简介背景介绍如今互联网项目都采用接口形式进行开发。该规范定义了一个元数据模型,默认的元数据来源是注解。 时间:2017年11月08日星期三说明:使用JSR303规范校验http接口请求参数 源码:https://github.com/zccodere/s... 第一章:理论简介 1-1 背景介绍 如今互联网项目都采用HTTP接口...
摘要:我们有时需要对前端传过来的数据做校验,就可以使用。他可以使我们不用在每个编写校验代码,可以达到解耦的功能。本文环境为,框架使用。 我们有时需要对前端传过来的数据做校验,就可以使用spring validation。他可以使我们不用在每个Controller编写校验代码,可以达到解耦的功能。本文环境为jdk8,框架使用springboot 2.1.0.RELEASE。1.添加依赖 ...
摘要:前言估计很多朋友都认为参数校验是客户端的职责,不关服务端的事。轻则导致服务器宕机,重则泄露数据。所以,这时就需要设置第二道关卡,服务端验证了。老项目的服务端校验不能为空不能为空看以上代码,就一个的校验就如此麻烦。 前言 估计很多朋友都认为参数校验是客户端的职责,不关服务端的事。其实这是错误的,学过 Web 安全的都知道,客户端的验证只是第一道关卡。它的参数验证并不是安全的,一旦被有心人...
摘要:初步使用主要使用注解的方式对进行校验,第一个例子在需要校验的字段上指定约束条件然后在中可以这样调用,加上注解即可。如果校验失败,默认会返回框架的出错信息。指定到的分组名会全部进行校验,不指定的不校验。 Spring Boot - 表单校验(JSR303&Hibernate Validator) 回顾 Spring Boot - 初识 Hello World Spring Boot -...
摘要:本文主要介绍在中自动校验的机制。引入依赖我们使用构建应用来进行演示。在中校验数据值得注意的地方参数前需要加上注解,表明需要对其进行校验,而校验的信息会存放到其后的中。层改写方法限定需要进行校验,而方法则不做限制。 简介 JSR303/JSR-349,hibernate validation,spring validation之间的关系。JSR303是一项标准,JSR-349是其的升级版...
阅读 1915·2021-11-23 10:03
阅读 4016·2021-11-22 09:34
阅读 2396·2021-10-08 10:05
阅读 2193·2019-08-30 15:53
阅读 1650·2019-08-30 13:56
阅读 1119·2019-08-29 16:52
阅读 1053·2019-08-26 13:31
阅读 3321·2019-08-26 11:45