springmvc HandlerExceptionResolver处理Controller全局异常

提出问题

Controller报错时的错误提示

访问下面Controller,会报错

@Controller
public class TestErrorCtrl {
    @RequestMapping("testerror")
    public String testError(){
        int i=1/0;
        return "success";
    }
}

错误页面

如下:

错误提示页面很不友好,用户一脸懵逼

解决

通过HandlerExceptionResolver接口处理Controller全局异常,在springmvc、springboot工程中都能使用

在 springboot中,可以被 @ControllerAdvice 和 @ExceptionHandler 注解替代

例子:报错时跳转到错误提示页面

异常解析器代码

package top.malaoshi.stdsecurity.config;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

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

public class GlobalExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        System.out.println("全局异常:"+e.getMessage());
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg",e.getMessage());
        mv.setViewName("error");
        return mv;
    }
}

修改 springMVC.xml

需要配置到xml中

<bean class="top.malaoshi.config.GlobalExceptionResolver"></bean>

注意:@Component

如果使用 springmvc+spring,或者springboot,可以使用 @Component 注解,不需要配置到xml中

jsp

<body>
${msg}
</body>

例子:输出json

package top.malaoshi.stdsecurity.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Component
public class GlobalExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) {
        System.out.println("全局异常:"+e.getMessage());

        Map<String,String> map=new HashMap<>();
        map.put("error",e.getMessage());

        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json; charset=utf-8");
        try {
            //使用Jackson输出json
            new ObjectMapper().writeValue(response.getWriter(),map);
            response.getWriter().flush();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return new ModelAndView();
    }
}

原文出处:/show_1EF61Buv8LFg.html