栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Spring使用BindingResult统一拦截,controller不写内容

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Spring使用BindingResult统一拦截,controller不写内容

1. 引入pom
        
        
            org.springframework.boot
            spring-boot-starter-validation
        

		
		
			org.projectlombok
			lombok
			true
		
2. controller使用

返回的类

@Data
public class Pesponsibles {
    private String field;
    private String defaultMessage;
}

controller方法

    //post 方法,返回json,json返回注解写在方法上,也可以。 @Valid 和 Validated 都行,推荐 valid
    @RequestMapping(value = "/test", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody
    ResponseEntity testBindingResult(@Valid @RequestBody Parameter parameter, BindingResult bindingResult) {
        log.info("测试开始,这个是lombok注解");
        //返回
        Pesponsibles p = new Pesponsibles();
        //如果包含错误
        if (bindingResult.hasErrors()) {
            //获取到 所有错误
            List fieldErrors = bindingResult.getFieldErrors();

            //使用 forEach遍历
            fieldErrors.forEach(fieldError -> {
                //日志打印不符合校验的字段名和错误提示
                log.error("错误的字段是 : {} ,消息是 : {}", fieldError.getField(), fieldError.getDefaultMessage());
                p.setField(fieldError.getField());
                p.setDefaultMessage(fieldError.getDefaultMessage());
                break;
            });

            // pesponsibles.setError_msg(fieldErrors);
            return new ResponseEntity<>(p, HttpStatus.BAD_REQUEST);
        }
        return new ResponseEntity<>(p, HttpStatus.OK);
    }
            //使用 普通for遍历
            for (int i = 0; i < fieldErrors.size(); i++) {
                //控制台打印不符合校验的字段名和错误提示
                System.out.println("error field is :" + fieldErrors.get(i).getField() + ",message is :" + fieldErrors.get(i).getDefaultMessage());

            }
3. 请求参数
@Data
public class Parameter {

    @NotEmpty(message="姓名不能为空")
    private String name;

    @Min(value = 18, message = "年龄必须大于18岁")
    private int age;

    @NotEmpty(message="hobbies不能为空")
    private List hobbies;

    @NotBlank(message="账号不能为空")
    private String account;

    @Size(min=5,max=10,message="密码的长度应该在5和10之间")
    private String password;

    @Email(message="邮箱格式错误")
    private String email;
}
4. 测试
{
    "name":"张三",
    "age":22,
    "hobbies":["唱歌","游泳"],
    "account":"123456",
    "password":"123456",
    "email":"123456"
}

//响应:
{
    "field": "email",
    "defaultMessage": "邮箱格式错误"
}
5. model注解详细 1. 整理1
@Data
public class OrgaByIdOutModel implements Serializable {
    
    
    @NotNull(message = "上级组织" + MyConstant.NOT_EMPTY)
    @JsonFormat(shape = JsonFormat.Shape.STRING)
    private Long superOrga;

    
    @Range(min = 1, max = 2, message = "启用状态" + MyConstant.ILLEGAL)
    private Integer status;

    @Pattern(message = "企业电话" + MyConstant.ILLEGAL, regexp = MyConstant.CONTACT_NUMBER_REGEX)
    private String phone;

    //这里用了一次size
    @Size(max = 80, min = 4, message = "企业地址" + MyConstant.ILLEGAL)
    private String address;

    @Length(min = 2, max = 10, message = "法人姓名" + MyConstant.ILLEGAL)
    private String legalPersonName;
}

    
    String PHONE_REGEX = "^1\d{10}$";
2. 整理2
常用校验注解

@Null 只能是null
@NotNull 不能为null 注意用在基本类型上无效,基本类型有默认初始值

@AssertFalse 必须为false
@AssertTrue 必须是true

字符串/数组/集合检查:(字符串本身就是个数组)
@Pattern(regexp="reg") 验证字符串满足正则
@Size(max, min) 验证字符串、数组、集合长度范围
@NotEmpty 验证字符串不为空或者null
@NotBlank 验证字符串不为null或者trim()后不为空

数值检查:同时能验证一个字符串是否是满足限制的数字的字符串
@Max 规定值得上限int
@Min 规定值得下限

@DecimalMax("10.8") 以传入字符串构建一个BigDecimal,规定值要小于这个值 
@DecimalMin 可以用来限制浮点数大小

@Digits(int1, int2) 限制一个小数,整数精度小于int1;小数部分精度小于int2
@Digits 无参数,验证字符串是否合法
@Range(min=long1,max=long2) 检查数字是否在范围之间
这些都包括边界值

日期检查:Date/Calendar
@Post 限定一个日期,日期必须是过去的日期
@Future 限定一个日期,日期必须是未来的日期

其他验证:
@Vaild 递归验证,用于对象、数组和集合,会对对象的元素、数组的元素进行一一校验
@Email 用于验证一个字符串是否是一个合法的右键地址,空字符串或null算验证通过
@URL(protocol=,host=,port=,regexp=,flags=) 用于校验一个字符串是否是合法UR
6. 统一拦截

在Spring 3.2中,

  • 新增了@ControllerAdvice、@RestControllerAdvice 注解,
  • 可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,
  • 并应用到所有@RequestMapping、@PostMapping, @GetMapping注解中。
1. controller删减
    @RequestMapping(value = "/test", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody
    ResponseEntity testBindingResult(@Valid @RequestBody Parameter parameter) {
        log.info("执行正确了");
        return new ResponseEntity<>(parameter, HttpStatus.OK);
    }
2. 增强型控制器
@ControllerAdvice
public class GlobalExceptionHandlerAdvice {
    
    
    @ResponseBody
    @ExceptionHandler(value = {MethodArgumentNotValidException.class, BindException.class})
    public ResponseEntity methodArgumentNotValidExceptionHandler(Exception e, BindingResult bindingResult) {

        Pesponsibles p = new Pesponsibles();

        // 如果没有参数异常则直接返回错误信息
        if (bindingResult.hasErrors()) {
            //有异常下面处理
        } else {
            //bindingResult没有异常,但是exception有异常
            p.setDefaultMessage(e.getMessage());
            return new ResponseEntity<>(p, HttpStatus.BAD_REQUEST);
        }

        p.setField("bindingResult错误字段");
        //如果包含错误
        if (bindingResult.hasErrors()) {
            //获取到 所有错误
            List fieldErrors = bindingResult.getFieldErrors();

            // 如果有参数异常,则获取default message,并返回
            StringBuilder message = new StringBuilder("提示:");
            //拼接 错误
            fieldErrors.forEach(i -> message.append(i.getDefaultMessage()).append("!"));
            p.setDefaultMessage(message.toString());

            // pesponsibles.setError_msg(fieldErrors);
            return new ResponseEntity<>(p, HttpStatus.BAD_REQUEST);
        }

        return new ResponseEntity<>(p, HttpStatus.BAD_REQUEST);
    }

}
3. 测试
{
    "name":"张三",
    "age":22,
    "hobbies":["唱歌","游泳"],
    "account":"123456",
    "password":"123456",
    "email":"123456@qq.com"
}

打印:
执行正确了

返回:
{
    "name": "张三",
    "age": 22,
    "hobbies": [
        "唱歌",
        "游泳"
    ],
    "account": "123456",
    "password": "123456",
    "email": "123456@qq.com"
}

测试2
{
    "name":"张三",
    "age":17,
    "hobbies":["唱歌","游泳"],
    "account":"123456",
    "password":"123456",
    "email":"123456"
}
返回:
{
    "field": "bindingResult错误字段",
    "defaultMessage": "提示:年龄必须大于18岁!邮箱格式错误!"
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/459058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号