spring mvc 全局错误处理遇到的问题

今天项目甲方调用项目接口报了一个错误,直接显示异常信息的页面415(服务器无法处理请求附带的媒体格式) 。 很不美观。 

这显然不是我代码的问题,是调用方没有按约定请求。于是想整个全局异常处理。 本项目使用spring mvc 对外提供restful 接口。 

 网上找了下,大致有两种解决方案:

1. 继承HandlerExceptionResolver

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@Component("handlerExceptionResolver")
public class GlobalExceptionExceptionHandler implements HandlerExceptionResolver {

    private static Logger logger = LoggerFactory.getLogger(GlobalExceptionExceptionHandler.class);

    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        logger.error("GlobalExceptionExcetionHandler error:"+ request.getRequestURL(),ex);
        ModelAndView mv = new ModelAndView();
        MappingJackson2JsonView view = new MappingJackson2JsonView();
        mv.setView(view);
        mv.addObject("status", "fail");
        mv.addObject("message", "system error");
        return mv;
    }
}

2. 在controller 中使用@ExceptionHandler ,但是这个只对当前controller 请求有效

@ResponseBody
    @ExceptionHandler(Exception.class)
    public String bindException(Exception e) {
       //...
        return result;
    }

于是选择第一种方案,测试

当spring mvc 报空指针时时能够进入controller 方法, 但是对415 是没有作用的。 

网上找了半天说是 415 , 404 这种是error  ,   空指针这种  Exception .. 待会看下区别

解决方案是在web.xml 里配置 error-page 

<!-- 有个疑问 4开头的很多,难道穷举,怎么办-->
<error-page>
    <error-code>400</error-code>
    <location>/error/?code=400</location>
  </error-page>
  <error-page>
    <error-code>403</error-code>
    <location>/error/?code=403</location>
  </error-page>
  <error-page>
    <error-code>404</error-code>
    <location>/error/?code=404</location>
  </error-page>
  <error-page>
    <error-code>415</error-code>
    <location>/error/?code=415</location>

然后是 /error/  对应的controller 

import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/error")
public class ErrorController {
    @RequestMapping(value = "/", produces = "application/json;charset=UTF-8")
    @ResponseBody
    public String error_404(String code) {
        JSONObject o = new JSONObject();
        o.put("status","error");
        o.put("message",code);
        return o.toJSONString();
    }
}

最后: error 和 exception 区别 ?

1.  error 通常是jvm 运行状态出了问题导致的 如NoClassDefFoundError(打包漏类导致的),StackOverflowError

,exception 程序运行时可以预料的, ClassNotFoundException(反射,动态加载导致的找不到类)

Error(错误)表示系统级的错误和程序不必处理的异常,是java运行环境中的内部错误或者硬件问题。比如:内存资源不足等。对于这种错误,程序基本无能为力,除了退出运行外别无选择,它是由Java虚拟机抛出的。

Exception(违例)表示需要捕捉或者需要程序进行处理的异常,它处理的是因为程序设计的瑕疵而引起的问题或者在外的输入等引起的一般性问题,是程序必须处理的

服务器无法处理请求附带的媒体格式

原文地址:https://www.cnblogs.com/zhangchenglzhao/p/11354561.html