背景
Springboot默认把异常的处理集中到一个ModelAndView中了,但项目的实际过程中,这样做,并不能满足我们的要求。具体的自定义异常的处理,参看以下
具体实现
如果仔细看完springboot的异常处理详解,并且研究过源码后,我觉得具体的实现可以不用看了。。。
重写定义错误页面的url,默认只有一个/error
@Bean
publicEmbeddedServletContainerCustomizercontainerCustomizer(){
returnnewEmbeddedServletContainerCustomizer(){
@Override
publicvoidcustomize(ConfigurableEmbeddedServletContainercontainer){
container.addErrorPages(newErrorPage(HttpStatus.NOT_FOUND,"/error/404"));
container.addErrorPages(newErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/error/500"));
container.addErrorPages(newErrorPage(java.lang.Throwable.class,"/error/500"));
}
};
}
重写通过实现ErrorController,重写BasicErrorController的功能实现
/**
*重写BasicErrorController,主要负责系统的异常页面的处理以及错误信息的显示
*@seeorg.springframework.boot.autoconfigure.web.BasicErrorController
*@seeorg.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration
*
*@authorJonathan
*@version2016/5/3111:22
*@sinceJDK7.0+
*/
@Controller
@RequestMapping(value="error")
@EnableConfigurationProperties({ServerProperties.class})
publicclassExceptionControllerimplementsErrorController{
privateErrorAttributeserrorAttributes;
@Autowired
privateServerPropertiesserverProperties;
/**
*初始化ExceptionController
*@paramerrorAttributes
*/
@Autowired
publicExceptionController(ErrorAttributeserrorAttributes){
Assert.notNull(errorAttributes,"ErrorAttributesmustnotbenull");
this.errorAttributes=errorAttributes;
}
/**
*定义404的ModelAndView
*@paramrequest
*@paramresponse
*@return
*/
@RequestMapping(produces="text/html",value="404")
publicModelAndViewerrorHtml404(HttpServletRequestrequest,
HttpServletResponseresponse){
response.setStatus(getStatus(request).value());
Mapmodel=getErrorAttributes(request,
isIncludeStackTrace(request,MediaType.TEXT_HTML));
returnnewModelAndView("error/404",model);
}
/**
*定义404的JSON数据
*@paramrequest
*@return
*/
@RequestMapping(value="404")
@ResponseBody
publicResponseEntity
总结
第一步,通过定义containerCustomizer,重写定义了异常处理对应的视图。目前定义了404和500,可以继续扩展。
第二步,重写BasicErrorController,当然可以直接定义一个普通的controller类,直接实现第一步定义的视图的方法。重写的目的是重用ErrorAttributes。这样在页面,直接可以获取到status,message,exception,trace等内容。
如果仅仅是把异常处理的视图作为静态页面,不需要看到异常信息内容的话,直接第一步后,再定义error/404,error/500等静态视图即可。
ErrorController根据Accept头的内容,输出不同格式的错误响应。比如针对浏览器的请求生成html页面,针对其它请求生成json格式的返回
以上两步的操作,比网上流传的更能实现自定义化。希望对大家的学习有所帮助,也希望大家多多支持毛票票。