脚本宝典收集整理的这篇文章主要介绍了SpringBoot---错误处理机制,nginx架构分析,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
)原理-----spirngMVC错误处理的自动配置
可以参照ErrorMvcAutoconfiguration;错误处理的自动配置;
给容器中添加了以下组件:
1、DefaultErrorAttributes:
2、BasicErrorController:处理默认/error请求
3、ErrorPageCustomizer:错误页面定制
4、DefaultErrorViewResolver:
步骤:
一但系统出现4xx或者5xx之类的错误;ErrorPageCustomizer就会生效(定制错误的响应规则);就会来到/error
请求: 就会被BasicErrorController处理;
响应页面: 去哪个页面是由DefaultErrorViewResolver解析得到的;
[](
)如何定制错误响应
)1.定制错误响应页面
)1.如何定制错误的json数据
自定义异常:
public class UserNotFoundException extends RuntimeException
{
public UserNotFoundException()
{
suPEr("用户不存在");//错误显示
}
}
如何定制错误的JSON数据
@ControllerAdvice//处理全局异常的类
public class exception
{
//浏览器客户端返回的都是JSON数据
@ResponseBody
@ExceptionHandler(Exception.class)
public Map<String,Object> handleException(Exception e){
Map<String,Object> map = new HashMap<>();
map.put("code","user.notexist");
map.put("message",e.getMessage());
return map;
}
}
上面的写法没有自适应效果,即浏览器访问返回一个错误页面,其他客户端访问,返回一个JSON数据
)出现自适应效果:转发到error请求,让BasicErrorController来处理该请求
这里没有设置错误状态码,转发成功后,状态码为200,因此无法走到定制错误页面解析流程
@ControllerAdvice//处理全局异常的类
public class exception
{
@ExceptionHandler(UserNotFoundException.class)
public String handleException(Exception e){
Map<String,Object> map = new HashMap<>();
map.put("code","user.notexist");
map.put("message",e.getMessage());
//转发到error请求
//BasicErrorController:处理默认/error请求
return "forward:/error";
}
}
)传入我们自己的错误状态码 4xx 5xx,否则就不会进入定制错误页面的解析流程
@ControllerAdvice//处理全局异常的类
public class exception
{
@ExceptionHandler(UserNotFoundException.class)
public String handleException(Exception e, HttpServletRequest request){
Map<String,Object> map = new HashMap<>();
//传入我们自己的错误状态码 4xx 5xx,否则就不会进入定制错误页面的解析流程
/**
* Integer statusCode = (Integer) request
.getAttribute("javax.servlet.error.status_code");
*/
request.setattribute("javax.servlet.error.status_code",400);
map.put("code","user.notexist");
map.put("message",e.getMessage());
//转发到error请求
//BasicErrorController:处理默认/error请求
return "forward:/error";
}
}
)将我们定制数据携带出去
)出现错误以后,会来到/error请求,会被BasicErrorController处理,响应出去可以获取的数据是由getErrorAttributes得到的(是AbstractErrorController(ErrorController)规定的方法)
? 1、完全来编写一个ErrorController的实现类【或者是编写AbstractErrorController的子类】,放在容器中;
? 2、页面上能用的数据,或者是json返回能用的数据都是通过errorAttributes.getErrorAttributes得到;
)? 容器中DefaultErrorAttributes.getErrorAttributes();默认进行数据处理的;
自定义ErrorAttributes(错误属性)
这里sPRingboot都是去容器中查看用户是否存在上面的错误相关的类,如果没有才会使用默认的配置类,因此我们可以通过重写上面的错误类,放入容器中,完成定制错误数据并携带出去
CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】
ActiveMQ消息中间件面试专题解析拓展:
Spring面试答案解析拓展
高并发多线程面试解析与拓展
JVM面试专题解析与拓展!
以上是脚本宝典为你收集整理的SpringBoot---错误处理机制,nginx架构分析全部内容,希望文章能够帮你解决SpringBoot---错误处理机制,nginx架构分析所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。