提出问题
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();
}
}
