SpringBoot异常处理(二)
参数校验机制
JSR-303 Hibernate
参数接收方式:
- URL路径中的参数 {id} (@PathVariable(name="id") int-whatever)
- URL中的查询参数 ?name=Chanuncy (@RequestPara(name String-whatever)
- requestbody中的json字符串 {"name":"7yue","age":18} (@RequestBody Map<String,Object> person)
- 一般会新建一个dto(data transfer object) 来接受和发送参数,一个对象一个dto
@Getter
@Builder
public class PersonDTO {
private String name;
private Integer age;
private String password1;
private String password2;
}
简单参数检验:
@Validated 开启验证
@Range @Max @Min
@RestController
@RequestMapping("/banner")
//开启验证 下文@Max验证
@Validated
public class BannerController {
@RequestMapping("/test1/{id}")
public String test1(@PathVariable @Max(5) int id,
@RequestBody @Validated PersonDTO person){
//开启PersonDTO @Length验证
return "ok";
}
复杂参数验证:(对象)
@Validated 开启验证
@Valid 级联验证
PersonDTO:
@Getter
@Builder
//自定义注解后面会讲到
@PasswordEqual
public class PersonDTO {
@Length(min = 2, max=10, message = "大小不匹配")
private String name;
private Integer age;
private String password1;
private String password2;
//@Valid 开启SchoolDTO schoolName 验证
private SchoolDTO school;
}
@Getter
@Setter
public class SchoolDTO{
@Length(min=2)
priavte String schoolName;
}
自定义参数校验注解:
当逻辑十分复杂时就要自己定义参数校验注解
先导:注解和反射
四个元注解:
- @Target
- @Rentention
- @Documented
- @Inherited
使用注解的机制:反射
通过反射获取Class实例的方法:
- 对象.getClass()
- 类.class
- Class.forName(全类名)
新建一个验证两次输入相同字符串的注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
//将注解和逻辑处理类关联
@Constraint(validatedBy = PasswordValidator.class)
public @interface PasswordEqual {
String message() default "passwords are not equal";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
逻辑处理:
//ConstraintValidator<注解的名字,注解修饰的对象>
public class PasswordValidator implements ConstraintValidator<PasswordEqual, PersonDTO> {
@Override
public boolean isValid(PersonDTO personDTO, ConstraintValidatorContext constraintValidatorContext) {
String password1 = personDTO.getPassword1();
String password2 = personDTO.getPassword2();
boolean match = password1.equals(password2);
return match;
}
}
上述参数校验会抛出一个未处理的异常,所以我们要写对应的异常处理
在Spring-Boot异常处理(一)中的GlobalExceptionAdvice中添加:
//dto参数校验异常
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public UnifyResponse handleBeanValidation(HttpServletRequest req,MethodArgumentNotValidException e){
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
String errorMessage = this.formatAllErrorMessages(allErrors);
return new UnifyResponse(10001,errorMessage,req.getMethod() + ' ' + req.getRequestURI());
}
//url参数异常
@ExceptionHandler(ConstraintViolationException.class)
@ResponseBody
@ResponseStatus(HttpStatus.BAD_REQUEST)
public UnifyResponse handleConstraintViolationException(HttpServletRequest req, ConstraintViolationException e){
return new UnifyResponse(10001,e.getMessage(),req.getMethod() + ' ' + req.getRequestURI());
}
//格式化dto参数校验异常错误信息
private String formatAllErrorMessages(List<ObjectError> errors){
StringBuffer errorMsg = new StringBuffer();
errors.forEach(error -> errorMsg.append(error.getDefaultMessage()).append(';'));
return errorMsg.toString();
}
SpringBoot异常处理(二)的更多相关文章
- C++中的异常处理(二)
C++中的异常处理(二) 标签: c++C++异常处理 2012-11-24 20:56 1713人阅读 评论(2) 收藏 举报 分类: C++编程语言(24) 版权声明:本文为博主原创文章,未经 ...
- SpringBoot异常处理统一封装我来做-使用篇
SpringBoot异常处理统一封装我来做-使用篇 简介 重复功能我来写.在 SpringBoot 项目里都有全局异常处理以及返回包装等,返回前端是带上succ.code.msg.data等字段.单个 ...
- Springboot异常处理和自定义错误页面
1.异常来源 要处理程序发生的异常,首先需要知道异常来自哪里? 1.前端错误的的请求路径,会使得程序发生4xx错误,最常见的就是404,Springboot默认当发生这种错误的请求路径,pc端响应的页 ...
- SpringBoot开发二十-Redis入门以及Spring整合Redis
安装 Redis,熟悉 Redis 的命令以及整合Redis,在Spring 中使用Redis. 代码实现 Redis 内置了 16 个库,索引是 0-15 ,默认选择第 0 个 Redis 的常用命 ...
- 【使用篇二】SpringBoot异常处理(9)
异常的处理方式有多种: 自定义错误页面 @ExceptionHandler注解 @ControllerAdvice+@ExceptionHandler注解 配置SimpleMappingExcepti ...
- springboot 入门二- 读取配置信息一
在上篇入门中简单介绍下springboot启动使用了大量的默认配置,在实际开发过程中,经常需要启动多个服务,那端口如何手动修改呢? 此篇就是简单介绍相关的配置文件信息. Spring Boot允许外部 ...
- SpringBoot(二)Web整合开发
Spring Boot (二):Web 综合开发 本篇文章接着上篇内容继续为大家介绍spring boot的其它特性(有些未必是spring boot体系桟的功能,但是是spring特别推荐的一些开源 ...
- SpringBoot学习(二)-->Spring的Java配置方式
二.Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @Bean Spring的Java配置方式是通过 @ ...
- SpringBoot 异常处理
异常处理最佳实践 根据我的工作经历来看,我主要遵循以下几点: 尽量不要在代码中写try...catch.finally把异常吃掉. 异常要尽量直观,防止被他人误解 将异常分为以下几类,业务异常,登录状 ...
随机推荐
- C++ 虚基类的定义、功能、规定
原文声明:http://blog.sina.com.cn/s/blog_93b45b0f01011pkz.html 虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断一个继承是否是虚继承的,虽然 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的autoFillBackground属性
autoFillBackground属性可以确认部件背景是否自动填充,如果自动填充,Qt会在调用Paint事件之前填充部件的背景.使用的颜色由部件调色板中的QPalette.window 角色定义(关 ...
- [BJDCTF 2nd]duangShell 反弹shell
[BJDCTF 2nd]duangShell [BJDCTF 2nd]duangShell 点击进去之后提示我们swp源代码泄露,访问http://xxx/.index.php.swp下载该文件 ...
- DVWA SQL Injection Medium
Mdeium 基本的步骤及知识点在上节已经提到过这里不再赘述:https://blog.csdn.net/WQ_BCJ/article/details/84554777 1)与low级别不同,本次采用 ...
- 基于gin的golang web开发:服务间调用
微服务开发中服务间调用的主流方式有两种HTTP.RPC,HTTP相对来说比较简单.本文将使用 Resty 包来实现基于HTTP的微服务调用. Resty简介 Resty 是一个简单的HTTP和REST ...
- es6交换两个值
let a='a',b='b' let [a,b]=[b,a];//借助数组解构 let {a:b,b:a}={a,b}//利用别名进行对象解构
- jvm 模型
- mac下git连接github远程仓库
git配置 一.安装git 官方网站下载安装,如果有安装homebrew,在终端输入brew install git,安装后的位置在/Users/计算机用户名目录下安装完成后,在终端输入git --v ...
- ES6、ES7、ES8
ES6 https://es6.ruanyifeng.com/ ES7 1.Array.prototype.includes() includes()作用,是查找一个值在不在数组里,若是存在则返回 ...
- linux环境下jdk安装以及配置
linux 环境安装jdk和配置环境变量: (此处以root用户安装,此方式安装一台虚拟机装一个jdk即可,所有普通用户可以共用) 1.下载安装jdk 链接: https://pan.baidu.co ...