免费资源网,https://freexyz.cn/

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 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 {

/**

* 返回状态码 除200其余全部失败

*/

private int code;

/**

* 返回信息 除success其余全部失败

*/

private String msg;

/**

* 泛型数据

*/

private T data;

/**

* 成功时返回的类型

*

* @param data 数据

* @param 泛型

* @return 泛型数据

*/

public static Result success(T data) {

return new Result<>(200, "success", data);

}

public static Result 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 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> resultSet = VALIDATOR.validate(obj, groups);

if (resultSet.size() > 0) {

//如果存在错误结果,则将其解析并进行拼凑后异常抛出

List errorMessageList = resultSet.stream().map(ConstraintViolation::getMessage).collect(Collectors.toList());

errorMessageList.forEach(o -> errorMessage.append(o).append(";"));

}

return errorMessage.toString();

}

}

8、整体测试类

免费资源网,https://freexyz.cn/

java author 认证_详解Java后端优雅验证参数合法性相关推荐

  1. java 引用传递_详解java的值传递、地址传递、引用传递

    详解java的值传递.地址传递.引用传递 一直来觉得对值传递和地址传递了解的很清楚,刚才在开源中国上看到一篇帖子介绍了java中的值传递和地址传递,看完后感受颇深.下边总结下以便更容易理解. 按照以前 ...

  2. java内部格式_详解java内部类的访问格式和规则

    详解java内部类的访问格式和规则 1.内部类的定义 定义一个类来描述事物,但是这个事物其中可能还有事物,这时候在类中再定义类来描述. 2.内部类访问规则 ①内部类可以直接访问外部类中的成员,包括私有 ...

  3. java comparator相等_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 发布于 2020-7-20| 复制链接 摘记: 详解Java中Comparable和Comparator接口的区别本文要来详细分析一 ...

  4. python java混合编程_详解java调用python的几种用法(看这篇就够了)

    java调用python的几种用法如下: 在java类中直接执行python语句 在java类中直接调用本地python脚本 使用Runtime.getRuntime()执行python脚本文件(推荐 ...

  5. Java implement意思_详解JAVA中implement和extends的区别

    详解JAVA中implement和extends的区别 发布于 2020-4-14| 复制链接 摘记: 详解JAVA中implement和extends的区别extends是继承父类,只要那个类不是声 ...

  6. java sleep唤醒_详解Java中的线程让步yield()与线程休眠sleep()方法

    Java中的线程让步会让线程让出优先级,而休眠则会让线程进入阻塞状态等待被唤醒,这里我们对比线程等待的wait()方法,来详解Java中的线程让步yield()与线程休眠sleep()方法 线程让步: ...

  7. java runnable 异常_详解Java中多线程异常捕获Runnable的实现

    详解Java中多线程异常捕获Runnable的实现 1.背景: Java 多线程异常不向主线程抛,自己处理,外部捕获不了异常.所以要实现主线程对子线程异常的捕获. 2.工具: 实现Runnable接口 ...

  8. java 代码块_详解java中的四种代码块

    在java中用{}括起来的称为代码块,代码块可分为以下四种: 一.简介 1.普通代码块: 类中方法的方法体 2.构造代码块: 构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行. ...

  9. java static 函数_详解java中的static关键字

    Java中的static关键字可以用于修饰变量.方法.代码块和类,还可以与import关键字联合使用,使用的方式不同赋予了static关键字不同的作用,且在开发中使用广泛,这里做一下深入了解. 静态资 ...

最新文章

  1. LA4851餐厅(求好的坐标的个数)
  2. Move or commit them before Pull git
  3. javaee后台适合用的编辑器插件
  4. 链接在HTML的英文,英文:A链接标记ie下会自动补全href_HTML/Xhtml_网页制作
  5. weakhashmap_Java WeakHashMap values()方法与示例
  6. 阿里P8大佬亲自教你!Android内存泄漏总结,看看这篇文章吧!
  7. 单细胞分析Seurat使用相关的10个问题答疑精选!
  8. Flutter RefreshIndicator 下拉刷新组件 Material 风格的刷新效果
  9. grDevices | 如何在图形中使用数学表达式作为标注文本
  10. Linux系统管理(6)——Linux下启动Redis服务的几种方法
  11. bind9的初步使用(2)
  12. Datawhale组队学习周报(第030周)
  13. leetcode刷题java之739. 每日温度
  14. 网络安全——WEP实现无线局域网安全
  15. 2019年9月Leetcode每日训练日志
  16. ios从打包到上架全过程
  17. c++调用sanp7和西门子通信demo
  18. GitLab-CI持续集成(CI)的介绍与运行机制
  19. CSS(b站学习记录)
  20. NAS开通外网访问功能的三种方法

热门文章

  1. python3 [装饰器] 总结
  2. 基于jQuery焦点图片新闻代码(JS+CSS)
  3. 样本不均衡、长尾分布问题的方法整理(文献+代码)
  4. 数据挖掘之随机事件与随机变量
  5. Maven手工管理项目
  6. P2872 [USACO07DEC]Building Roads S(最小生成树)
  7. What is Freeview Play
  8. java resultset 赋值_ResultSet数据自动绑定到JavaBean中 | 学步园
  9. python扫地机器人开发学校_扫地机器人源码及解释
  10. python编程循环语句_循环语句—Python编程从入门到精通(5)