springboot-errorhandler

本文介绍如何在SpringBoot项目中优雅地处理异常,包括全局异常处理、404错误页面定制及Ajax请求异常处理等实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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返回不同的页面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值