写程序,难免会遇到一些异常。遇到了,处理了,给与友好提示就ok,springboot 默认自己就处理了异常,只是感觉有点不友好,
浏览器访问:
postman 接口获取:
页面不怎么友好,然后返回json格式的时候,可能和自己系统里面的数据返回格式不一致,这里就需要自己处理下了。
最简单的,根据源码可知:
在 error 文件夹下面可以根据 状态码来找页面。
此error 文件夹需要放在 springboot 的根目录下创建 error文件夹,然后放 404.html,500.html 等等。
不过这里,我建议最好放在 src/main/resources/templates/目录下,因为这里是 thy 的默认模板目录,可能把错误信息显示出来。
此时访问就是 404/500 去你定义的文件位置了。
此方法错误信息显示不详细,不能返回json数据,不建议使用。
@ControllerAdvice
public class ErrorController {
@ExceptionHandler(value = {Exception.class})
@ResponseBody
public Object error(){
Map map = new HashMap<>();
map.put("error", "出错了");
return map;
}
}
@ExceptionHandler里面的value 的值是一个数组可以各个定义各种异常,可以返回json也可以返回 modelAndView
但是这种处理方式处理不了 404,如果想通过这种方式处理,则需要在配置文件里面添加
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
但是这两句代码添加之后,又会导致静态资源不可使用。
@Configuration
public class ErrorController {
/** * 该方法必须要有返回值。返回值类型必须是: SimpleMappingExceptionResolver */
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
/*** 参数一:异常的类型,注意必须是异常类型的全名 * 参数二:视图名称 */
mappings.put("java.lang.ArithmeticException", "error1");
mappings.put("java.lang.NullPointerException","error2");
//设置异常与视图映射信息的 resolver.setExceptionMappings(mappings);
return resolver;
}
}
此方案和第二种方案类似,不建议使用。
已知@ControllerAdvice + @ExceptionHandle可以处理 除 404 以外的 运行异常,那么,捕获不到的异常就是404了。
两个类:
NotFoundException
@Controller
public class NotFoundException implements ErrorController {
@Override
public String getErrorPath() {
return "/error";
}
@RequestMapping(value = {"/error"})
@ResponseBody
public Object error(HttpServletRequest request) {
Map body = new HashMap<>();
body.put("error", "not found");
body.put("code", "404");
return body;
}
}
ExceptionController
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = {Exception.class})
@ResponseBody
public Object error(Exception ex){
Map map = new HashMap<>();
map.put("error", ex.getMessage());
map.put("code", "500");
return map;
}
}
自己定义方法,想返回什么就返回什么,无论是 html 还是json,
运行效果如下
完美O(∩_∩)O