详解Java后端优雅验证参数合法性
更新时间:2021年2月18日 20:00 点击:2992
1、首先创建一个测试实体类Person,并携带如上注解,其注解的作用描述在message
package com.clickpaas.pojo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Range; import javax.validation.constraints.*; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * @author 方延杰 * @version 1.0 * @since 2020/12/10 9:04 下午 */ @Data public class Person { @Null(message = "death必须为null") private String death; @AssertTrue(message = "bool必须为true") private boolean bool; @AssertFalse(message = "fal必须为false") private boolean fal; @Min(value = 1, message = "min必须为数字,其值大于或等于指定的最小值") private Integer min; @Max(value = 10, message = "max必须为数字,其值小于或等于指定的最大值") private Integer max; @DecimalMin(value = "1", message = "minDeci最小不能小于1") private BigDecimal minDeci; @DecimalMax(value = "10", message = "maxDeci最大不能大于10") private BigDecimal maxDeci; @Size(min = 1, max = 2, message = "list集合的长度最小不能小于1,最大不能大于2") private List<Object> list; @Digits(integer = 4, fraction = 2, message = "digits整数位不能超过4个,小数位不能超过2个") private BigDecimal digits; /** * 将前台传来的日期数据映射到此字段 */ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Past(message = "past必须为过去的日期") private Date past; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Future(message = "future必须为将来的日期") private Date future; @Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$", message = "phone必须符合正则表达式") private String phone; @Email(message = "email必须是邮箱格式") private String email; @Length(min = 1, max = 2, message = "length长度最小不能小于1,最大不能大于2") private String length; @NotEmpty(message = "id不能为null,长度大于0") private String id; @Range(min = 1, max = 12, message = "month最小不能小于1,最大不能大于12") private Integer month; @NotBlank(message = "name不能为null,字段串长度大于0(限字符串)") private String name; }
2、封装返回响应体
package com.clickpaas.response; import lombok.AllArgsConstructor; import lombok.Data; /** * @author 方延杰 * @version 1.0 * @since 2019/7/3 4:32 下午 */ @Data @AllArgsConstructor public class CodeMsg { private int code; private String msg; /** * 失败 */ public static CodeMsg SERVER_ERROR = new CodeMsg(500, "服务端异常"); }
package com.clickpaas.response; import lombok.AllArgsConstructor; import lombok.Data; /** * @author 方延杰 * @version 1.0 * @since 2019/7/3 4:35 下午 */ @Data @AllArgsConstructor public class Result<T> { /** * 返回状态码 除200其余全部失败 */ private int code; /** * 返回信息 除success其余全部失败 */ private String msg; /** * 泛型数据 */ private T data; /** * 成功时返回的类型 * * @param data 数据 * @param <T> 泛型 * @return 泛型数据 */ public static <T> Result<T> success(T data) { return new Result<>(200, "success", data); } public static <T> Result<T> fail(CodeMsg codeMsg) { return new Result<>(codeMsg); } private Result(CodeMsg codeMsg) { if (codeMsg == null) { return; } this.code = codeMsg.getCode(); this.msg = codeMsg.getMsg(); } }
3、创建使用增强器拦截并返回异常信息
package com.clickpaas.config; import com.clickpaas.response.CodeMsg; import com.clickpaas.response.Result; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.servlet.http.HttpServletRequest; import java.util.Objects; /** * @author 方延杰 * @version 1.0 * @since 2018/12/10 4:59 下午 */ @RestControllerAdvice public class GlobalExceptionInterceptor { @ExceptionHandler(value = MethodArgumentNotValidException.class) public Result<Object> exceptionHandler(HttpServletRequest request, Exception e) { String errMsg = "处理失败"; if (e instanceof MethodArgumentNotValidException) { // 拿到参数校验具体异常信息 errMsg = Objects.requireNonNull(((MethodArgumentNotValidException) e).getBindingResult().getFieldError()).getDefaultMessage(); } return Result.fail(new CodeMsg(500, errMsg)); } }
4、创建控制层测试
package com.clickpaas.controller; import com.clickpaas.pojo.Person; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; /** * @author 方延杰 * @version 1.0 * @since 2020/12/10 9:03 下午 */ @RestController public class ValidController { @PostMapping("/valid") public String valid(@Validated @RequestBody Person person) { return "success"; } }
5、测试符合验证请求体访问,请求体如下:
{ "death":null, "bool":true, "fal":false, "min":1, "max":10, "minDeci":1, "maxDeci":10, "list":[ {},{} ], "digits":1144.12, "past":"2020-10-01 10:00:00", "future":"2022-10-01 10:00:00", "phone":"15900445584", "email":"yanjie.fang@clickpaas.com", "length":"ab", "id":" ", "name":"a" }
6、故意修改不符合验证的数据
7、如果想做整体验证,如下:
package com.clickpaas.uitl; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * Bean整体校验工具类 * * @author 方延杰 * @version 1.0 * @since 2020/12/10 10:08 下午 */ public class ValidatorUtils { private static final Validator VALIDATOR = Validation.buildDefaultValidatorFactory().getValidator(); /** * Bean整体校验,有不合规范,拼接message */ public static String validate(Object obj, Class<?>... groups) { StringBuilder errorMessage = new StringBuilder(); Set<ConstraintViolation<Object>> resultSet = VALIDATOR.validate(obj, groups); if (resultSet.size() > 0) { //如果存在错误结果,则将其解析并进行拼凑后异常抛出 List<String> errorMessageList = resultSet.stream().map(ConstraintViolation::getMessage).collect(Collectors.toList()); errorMessageList.forEach(o -> errorMessage.append(o).append(";")); } return errorMessage.toString(); } }
8、整体测试类
到此这篇关于详解Java后端优雅验证参数合法性的文章就介绍到这了,更多相关Java 验证参数合法性内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
相关文章
- 这篇文章主要介绍了如何利用java语言实现经典《复杂迷宫》游戏,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试...2022-02-01
java 运行报错has been compiled by a more recent version of the Java Runtime
java 运行报错has been compiled by a more recent version of the Java Runtime (class file version 54.0)...2021-04-01- 这篇文章主要介绍了在java中获取List集合中最大的日期时间操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
- 这篇文章主要介绍了教你怎么用Java获取国家法定节假日,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下...2021-04-23
- 这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-31
- 说起C#和Java这两门语言(语法,数据类型 等),个人以为,大概有90%以上的相似,甚至可以认为几乎一样。但是在工作中,我也发现了一些细微的差别...2020-06-25
- 这篇文章主要给大家介绍了关于Nest.js参数校验和自定义返回数据格式的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-28
- 这篇文章主要介绍了解决Java处理HTTP请求超时的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-29
- 这篇文章主要介绍了java 判断两个时间段是否重叠的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-15
java 画pdf用itext调整表格宽度、自定义各个列宽的方法
这篇文章主要介绍了java 画pdf用itext调整表格宽度、自定义各个列宽的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-31- 这篇文章主要介绍了超简洁java实现双色球若干注随机号码生成(实例代码),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-04-02
- 这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
- 这篇文章主要介绍了解决Springboot get请求是参数过长的情况,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
废话不多说了,直接给大家贴代码了。<?php class test{} $a1 = null; $a2 = ""; //$a3 = $a4 = 0; $a5 = '0'; $a6 = false; $a7 = array(); //var $a8; $a9 = new test(); for ($i=1; $i <=9 ; $i++) {...2015-11-24- 这篇文章主要介绍了java正则表达式判断前端参数修改表中另一个字段的值,需要的朋友可以参考下...2021-05-07
Java使用ScriptEngine动态执行代码(附Java几种动态执行代码比较)
这篇文章主要介绍了Java使用ScriptEngine动态执行代码,并且分享Java几种动态执行代码比较,需要的朋友可以参考下...2021-04-15- 这篇文章主要介绍了Java开发实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-08-03
- mysql安装成功后有几个默认的配置模板,列表如下: my-huge.cnf : 用于高端产品服务器,包括1到2GB RAM,主要运行mysql my-innodb-heavy-4G.ini : 用于只有innodb的安装,最多有4GB RAM,支持大的查询和低流量 my-large.cnf : 用于...2015-03-15
- 这篇文章主要介绍了C#泛型的类型参数约束的相关资料,文中讲解非常细致,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下...2020-07-31
- 这篇文章主要介绍了Java List集合返回值去掉中括号('[ ]')的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-29