Spring boot
springboot能快速的构建项目,各个模块逻辑很清晰,需要用的引入jar包就能使用,官网的资料也很充足,用起来特别上手。所以之后的小项目基本上都会用springboot框架。
异常处理
springboot默认出现异常返回一个默认的页面,有点丑,而且不能处理ajax异步请求的异常,比方说404。
写这个文章是为了记录下自己学习过程中遇到的问题,做个笔记,顺带分享一下,有问题的欢迎指出来。
这里分享下springboot官网文档的地址:http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/
文档中指出可以使用多种方式处理异常。这里举两个例子:
@ControllerAdvice
package com.fruitday.controller;
import javax.servlet.http.HttpServletRequest;
import org.jboss.logging.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException;
/**
* ControllerAdvice 可通过 annotations(), basePackageClasses(), basePackages() 选择控制器子集
* annotations=Controller.class 只对声明为Controller的控制器生效。
* @author cxx
*/
@ControllerAdvice(annotations=Controller.class)
public class ExceptionHandlerController{
static Logger log = Logger.getLogger(ExceptionHandlerController.class);
/**
* 处理所有抛出来的异常
* @param ex
* @param request
* @return
*/
@ExceptionHandler(Exception.class)
public String handlerAll(Exception ex, HttpServletRequest request) {
log.error(ex.getMessage(), ex);
request.setAttribute("errorTips", ex.getMessage());
request.setAttribute("ex", ex);
return "error/sysError";
}
/**
* 处理 NoHandlerFoundException 类型的异常
* @param ex
* @param request
* @return
*/
@ExceptionHandler(NoHandlerFoundException.class)
public String handlerNoFound(NoHandlerFoundException ex, HttpServletRequest request) {
log.error(ex.getMessage(), ex);
request.setAttribute("errorTips", ex.getMessage());
return "error/404";
}
}
可以根据异常类型通过@ExceptionHandler(XXX.class)声明不同的异常处理器.
但是要想处理ajax异步请求的404错误,还需要让DispatchServlet在遇到404时抛出异常,以便被handlerNoFound捕获。
application.properties中添加
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
第一行是找不到处理器时抛出异常。
第二行是解决静态文件404时抛nullpoint异常。
ErrorController
声明一个Controller并实现ErrorController。
@Controller
public class ExceptionHandlerController implements ErrorController{
private static final String ERROR_PATH ="/error";
@RequestMapping(value=ERROR_PATH)
public String handlerException(HttpServletResponse res){
System.out.println(res.getStatus());
return "/error/404";
}
@Override
public String getErrorPath() {
// TODO Auto-generated method stub
return ERROR_PATH;
}
}
实现接口方法 getErrorPath(),返回异常时的重定向路径。
再声明一个@RequestMapping来处理这个重定向。传入参数为Response,以便获取status,再根据status返回不同的页面。