网站如何做微信支付宝支付宝,太原建站模板厂家,广州建设培训网站,军事新闻内容摘抄【SpringBoot3】全局异常处理 一、全局异常处理器step1#xff1a;创建收入数字的页面step2:创建控制器#xff0c;计算两个整数相除step3:创建自定义异常处理器step5#xff1a;创建给用提示的页面step6#xff1a;测试输入#xff08;10/0#xff09; 二、BeanValidato… 【SpringBoot3】全局异常处理 一、全局异常处理器step1创建收入数字的页面step2:创建控制器计算两个整数相除step3:创建自定义异常处理器step5创建给用提示的页面step6测试输入10/0 二、BeanValidator 异常处理step1:添加 JSR-303 依赖step2:创建 Bean 对象属性加入 JSR-303 注解step3:Controlller 接收请求step4:创建异常处理器step5测试 在 Controller 处理请求过程中发生了异常DispatcherServlet 将异常处理委托给异常处理器处理异常的类。实现 HandlerExceptionResolver 接口的都是异常处理类。 项目的异常一般集中处理定义全局异常处理器。在结合框架提供的注解诸如ExceptionHandlerControllerAdvice ,RestControllerAdvice 一起完成异常的处理。ControllerAdvice 与RestControllerAdvice 区别在于RestControllerAdvice 加了RepsonseBody。 一、全局异常处理器 需求应用计算两个数字相除当用户被除数为 0 发生异常。使用自定义异常处理器代替默认的异常处理程序 step1创建收入数字的页面
在 static 目录下创建 input.html , static 目录下的资源浏览器可以直接访问
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
form actiondivide methodpost除nbsp;nbsp;nbsp;数:input typetext namen1 br/被除数:input typetext namen2 br/input typesubmit value计算
/form
/body
/htmlstep2:创建控制器计算两个整数相除
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;RestController
public class NumberController {PostMapping(/divide)public String some(Integer n1,Integer n2){int result n1/n2;return n1/n2 result;}
}step3:创建自定义异常处理器
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.List;
import java.util.Map;//控制器增强
ControllerAdvice
public class GlobalExceptionHandler {ExceptionHandler({ArithmeticException.class})public String handlerArtithmecticException(ArithmeticException e, Model model){String error e.getMessage();model.addAttribute(error,error);return exp;}/* ExceptionHandler({ArithmeticException.class})ResponseBodypublic MapString,String handlerArtithmecticException(ArithmeticException e){MapString,String errors new HashMap();errors.put(msg,e.getMessage());errors.put(tips,被除数不能为0);return errors;}*/
}step5创建给用提示的页面
在 resources/templates/ 创建 exp.html
!DOCTYPE html
html langen
headmeta charsetUTF-8titleTitle/title
/head
body
h3显示异常信息div th:text ${error}/div /h3
/body
/htmlstep6测试输入10/0 二、BeanValidator 异常处理 使用 JSR-303 验证参数时我们是在 Controller 方法声明BindingResult 对象获取校验结果。Controller 的方法很多每个方法都加入 BindingResult 处理检验参数比较繁琐。 校验参数失败抛出异常给框架异常处理器能够捕获到 MethodArgumentNotValidException它是 BindException 的子类。 BindException 异常实现了 BindingResult 接口异常类能够得到 BindingResult 对象进一步获取 JSR303 校 验的异常信息。 需求全局处理 JSR-303 校验异常
step1:添加 JSR-303 依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-validation/artifactId/dependencystep2:创建 Bean 对象属性加入 JSR-303 注解
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.hibernate.validator.constraints.Range;Data
public class OrderVO {NotBlank(message 订单名称不能为空)private String name;NotNull(message 商品必须有数量)Range(min 1,max 99,message 一个订单商品数量在{min} -- {max})private Integer amount;NotNull(message 用户不能为空)Min(value 1,message 从1开始)private Integer userId;
}
step3:Controlller 接收请求
import com.bjpowernode.exp.vo.OrderVO;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;RestController
public class OrderController {PostMapping(/order/new)public String createOrder(Validated RequestBody OrderVO orderVO){return 订单信息 orderVO.toString();}
}step4:创建异常处理器
import org.springframework.ui.Model;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap;
import java.util.List;
import java.util.Map;//控制器增强
ControllerAdvice
public class GlobalExceptionHandler {ExceptionHandler({ArithmeticException.class})public String handlerArtithmecticException(ArithmeticException e, Model model){String error e.getMessage();model.addAttribute(error,error);return exp;}/* ExceptionHandler({ArithmeticException.class})ResponseBodypublic MapString,String handlerArtithmecticException(ArithmeticException e){MapString,String errors new HashMap();errors.put(msg,e.getMessage());errors.put(tips,被除数不能为0);return errors;}*///处理JSR303 验证参数的异常//ExceptionHandler({BindException.class})ExceptionHandler({MethodArgumentNotValidException.class})ResponseBodypublic MapString,Object handlerJSR303Exception(MethodArgumentNotValidException e){System.out.println(JSR303);MapString,Object map new HashMap();BindingResult result e.getBindingResult();if(result.hasErrors()){ListFieldError fieldErrors result.getFieldErrors();for (int i 0; i fieldErrors.size(); i) {FieldError fieldError fieldErrors.get(i);map.put(i - fieldError.getField(), fieldError.getDefaultMessage());}}return map;}
}核心代码 step5测试
POST http://localhost:8080/order/new
Content-Type: application/json{name: 每日订单,amount: 0,userId: 0
}显示 { “1-amount”: “一个订单商品数量在1 – 99”, “0-userId”: “从1开始” }