写点什么

SpringBoot--- 错误处理机制,kafka 实现负载均衡的原理

用户头像
极客good
关注
发布于: 刚刚

如果是其他客户端,默认响应一个 JSON 数据




原理-----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 的子类】,放在容器中;

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot---错误处理机制,kafka实现负载均衡的原理