第一种方法:
1、自己写一个运行时异常
然后故意出现这个异常抛出异常【测试】
然后自定义一个异常解析器即可:
package com.bihu.component; import com.bihu.Exception.UserNonExistentException; 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.Map; @ControllerAdvice //这个注解标志异常的 public class MyExceptionHandler{ @ResponseBody @ExceptionHandler(UserNonExistentException.class) //表示一旦抛出这个异常 此处理器就生效 public Map<String,Object> exceptionHandling(Exception e) { Map<String,Object> result = new HashMap<>(); result.put("message",e.getMessage()); return result; } }
运行:
所以无论是 客户端还是浏览器 都是以 JSON格式来返回错误信息,,,,,,这样的缺点就是自适应性不好。
第二种方法:【自适应性,浏览器解析网页;客户端解析为JSON】
在第一种的前提下,改变异常解析器
1.自定义自己的异常解析器:
package com.bihu.component; import com.bihu.Exception.UserNonExistentException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.Map; @ControllerAdvice //这个注解标志异常的 public class MyExceptionHandler{ @ExceptionHandler(UserNonExistentException.class) //表示一旦抛出这个异常 此处理器就生效 public String exceptionHandling(Exception e, HttpServletRequest request) { //由于这里转发到error,所以这里的错误码永远是200成功 我们需要更改: request.setAttribute("javax.servlet.error.status_code",500); //至于为啥 后面一起讲 Map<String,Object> map = new HashMap<>(); //这里的参数是带不出去的 return "froward:/error"; //为了自适应性 转发到 /error页面 让SpringBoot解析 } }
运行发现 浏览器和客户端给出的都不一样了:
错误码是200我理解,为什么设置错误码是用request.setAttribute() ??? 查看源码得知 ,SpringBoot原始获取错误码是这样获取的:
进入getStatus方法:
所以我们自己加入组件ErrorAttributes,然后在组件中
原文:https://www.cnblogs.com/bi-hu/p/15145491.html