温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringBoot中如何实现全局异常与数据校验

发布时间:2021-08-10 16:24:45 来源:亿速云 阅读:176 作者:Leah 栏目:编程语言

SpringBoot中如何实现全局异常与数据校验,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

项目建立

利用idea 工具,很容易的搭建一个SpringBoot项目,要引入的maven依赖如下:

<dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-validation</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-web</artifactId>  </dependency>  <dependency>   <groupId>org.springframework.boot</groupId>   <artifactId>spring-boot-starter-test</artifactId>   <scope>test</scope>  </dependency>

很简单,除了加入web功能还加入了我们需要用到的JSR-303校验框架。

定义成功失败 返回码

public class Code {   /**   * 成功   */   public static int SUCCESSED = 1;   /**   * 失败   */   public static int FAILED = -1;  }

定义接口返回响应实体

public class Response<T> implements Serializable{   /**   *    */   private static final long serialVersionUID = 4250719891313555820L;   /**   * 返回结果集   */   private T result;   /**   * 返回消息   */   private String msg;   /**   * 响应码   */   private Integer code;   //set get 略  }

全局异常拦截和验证

定义自定义业务异常

public class MyException extends RuntimeException {   private static final long serialVersionUID = -5875371379845226068L;   public MyException(){}   public MyException(String msg){   this.msg = msg ;   }   /**   * 异常信息   */   private String msg ;   /**   * 具体异常码   */   private int code = Code.FAILED;   get set 略

编写全局异常控制器并对自定义异常做处理

@ControllerAdvice  public class GlobalExceptionHandler {   private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);  @ExceptionHandler(value = MyException.class)  @ResponseBody  public Response<String> myExceptionErrorHandler(MyException ex) throws Exception {   logger.error("myExceptionErrorHandler info:{}",ex.getMessage());   Response<String> r = new Response<>();   r.setMsg(ex.getMsg());   r.setCode(ex.getCode());   return r;  }

编写controller模拟抛出业务异常

@RestController  @RequestMapping("/user")  public class UserController {  @PostMapping(value = "/update")  Response<Boolean> update(User user){   //todo 此处为模拟异常抛出   if(true){   throw new MyException("更新失败");   }   //todo 此处为模拟返回   Response<Boolean> response = new Response<>();   response.setCode(Code.SUCCESSED);   response.setResult(true);   return response;  }  }

postMan模拟请求接口,进行验证

SpringBoot中如何实现全局异常与数据校验

数据绑定异常处理

通常我们操作数据的时候,不仅前端需要进行数据校验,后端也应当进行拦截和进行相应的错误提示,JSR-303校验框架也是我们的一种选择。

编写实体`User`,并对属性进行注解控制

public class User {   @NotNull(message = "用户名不能为空")   private String userName;   private int age;   //...

全局异常控制类加入拦截

@ControllerAdvice  public class GlobalExceptionHandler {   private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);   @ExceptionHandler(value = BindException.class)   @ResponseBody   public Response<String> bindExceptionErrorHandler(BindException ex) throws Exception {   logger.error("bindExceptionErrorHandler info:{}",ex.getMessage());   Response<String> r = new Response<>();   StringBuilder sb = new StringBuilder();   FieldError fieldError = ex.getFieldError();   sb.append(fieldError.getDefaultMessage());   r.setMsg(sb.toString());   r.setCode(Code.FAILED);   return r;   }   //...

编写控制器

@RestController  @RequestMapping("/user")  public class UserController {   @PostMapping(value = "/add")   Response<User> add(@Validated User user){   //todo 此处为模拟返回   Response<User> response = new Response<>();   response.setCode(Code.SUCCESSED);   response.setResult(new User());   return response;   }   //...

postMan模拟请求

不填写任何属性,模拟添加操作,准确进行拦截和报错

SpringBoot中如何实现全局异常与数据校验

项目结构预览:

SpringBoot中如何实现全局异常与数据校验

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI