SpringMVC异常处理

229 阅读2分钟

404页面映射

异常 : 可控 代码里面能够处理的 不可控 URL错误链接等

springMVC 内置异常处理解析器

SpringMVC 通过实现HandlerExceptionResolver接口处理程序的异常

通过DispatcherServlet.properties 文件能够看到默认解析器

org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
   org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
   org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver

org.springframework.web.servlet.HandlerExceptionResolver 默认处理类
org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver 处理 @ExceptionHandler

org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver 解析 @ResponseStatus 注释类型的异常
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver 按照不同类型分别对异常进行解析

通过 HandlerExceptionResolver Ctrl+H 可以看到实现类

image.png

AbstractHandlerMethodExceptionResolver 是ExceptionHandlerExceptionResolver的父类。

SimpleMappingExceptionResolver 通常配置的异常类和view的对应关系解析异常。


@ResponseStatus() 定义返回状态码

@ResponseStatus(code= HttpStatus.FORBIDDEN)
 public String mytest(@RequestParam("name") String name){

     return "view";
 }

类中异常处理 本类

1、添加控制器方法@ExceptionHandler(Exception.class)

@ExceptionHandler(Exception.class)
public ModelAndView handlerException(Exception ex){
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("error");
    modelAndView.addObject("ex",ex);
    System.out.println(ex.getMessage());//日志记录
    return modelAndView;
}

2、添加error.jsp

<div style="color:blue;"><%=((Exception)request.getAttribute("ex")).getMessage()%></div>

JAVA捕获打印异常栈 信息

@ExceptionHandler(Exception.class)
public ModelAndView handlerException(Exception ex){
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("error");
    modelAndView.addObject("ex",ex);
    //获取异常栈信息 BEGIN
    StringWriter stringWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(stringWriter);
    ex.printStackTrace(printWriter);
    System.out.println(stringWriter.toString());
    //获取异常栈信息 END
    System.out.println(ex.getMessage());//日志记录

    return modelAndView;
}

全局异常处理

@ControllerAdvice
public class MyException {

    @ExceptionHandler(Exception.class)
    public ModelAndView   handleException(Exception ex){
        System.out.println("Controller Advice ex");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("error");
        modelAndView.addObject("ex",ex);
        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        ex.printStackTrace(printWriter);
        System.out.println(stringWriter.toString());

        System.out.println(ex.getMessage());

        return modelAndView;
    }
}

异常处理 同类中的优先级最高 其次是精度高的优先

@ExceptionHandler(MissingServletRequestParameterException.class)

JSON请求判断

1、根据类或方法上的注解

public ModelAndView handleExceptionMissingParameter(Exception ex, HandlerMethod handlerMethod,HttpServletRequest httpServletRuest, HttpServletResponse httpServletResponse){
    //根据用户请求的方法是否设置返回JSON
    Annotation annotation = handlerMethod.getClass().getAnnotation(RestController.class);
    Annotation annotation1 = handlerMethod.getMethod().getAnnotation(ResponseBody.class);
    if(annotation!=null ||annotation1!=null){
        //判断json请求类型
    }

2、根据头部信息

String header = httpServletRuest.getHeader("Content-Type");
System.out.println(header);

if(header !=null && header.indexOf("application/json") != -1 ){
    ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView());
    modelAndView.addObject("code", HttpStatus.INTERNAL_SERVER_ERROR.value());
    modelAndView.addObject("message",ex.getMessage());
    return modelAndView;


}else{
    System.out.println("MissingServletRequestParameterException do");
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("error");
    modelAndView.addObject("ex",ex);
    StringWriter stringWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(stringWriter);
    ex.printStackTrace(printWriter);

    System.out.println(stringWriter.toString());

    System.out.println(ex.getMessage());

    return modelAndView;

}

404等错误代码配置

1、spring xml配置

<mvc:resources mapping="/**/*.html" location="/"></mvc:resources>

2、创建业务页面

image.png

3、web.xml中配置

<error-page>
    <error-code>404</error-code>
    <location>/error.html</location>
</error-page>