需求:给安卓写后台接口,如果安卓端请求的接口路径发生错误,就向安卓端返回一个值,以json形式传回.
在网上搜了半天,实验后无果,最后将一些网上的思路整合,可以满足需求,但不规范.
思路:自定义一个拦截器,将404,500等错误进行判断,然后重定向一个路径,在该路径映射的controller下写具体返回值;
具体实现:
/**
* 自定义拦截器
*
*/
@Controller
public class ErrorInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;// 只有返回true才会继续向下执行,返回false取消当前请求
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//判断错误码
if(response.getStatus()==500){
}else if(response.getStatus()==404){
response.sendRedirect("getErrorStatus");//重定向
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
新建一个类继承WebMvcConfigurerAdapter
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个拦截器组成一个拦截器链
// addPathPatterns 用于添加拦截规则
registry.addInterceptor(new ErrorInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
新建一个异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 系统异常处理,比如:404,500
* @param req
* @param resp
* @param e
* @return
* @throws Exception
*/
@ExceptionHandler(value = Exception.class)
@ResponseBody
public ErrorInfo defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {
logger.error("", e);
ErrorInfo r = new ErrorInfo();
r.setMessage(e.getMessage());
if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {
r.setCode(404);
} else {
r.setCode(500);
}
r.setData(null);
r.setStatus(false);
return r;
}
}
javaBean,需要返回的值与类型可自行扩展.
public class ErrorInfo{
private boolean status;
private Integer code;
private String message;
private String Data;
//get,set省略
}
controller
@RestController //省去写ResponseBody
public class ErrorController {
@RequestMapping(value="/getErrorStatus")
public Map<String,String> getErrorStatus(){
Map<String,String> map = new HashMap<String,String>();
map.put("code", "404");
return map;
}
}
完成.
当404时,页面不会出现spring Boot error页面,而是一个json:{“code”:”404”}