springboot 统一管理异常信息

新建ResponseEntityExceptionHandler的继承类:(依然,需要入口类扫描)

/**
 * @author sky
 * @version 1.0
 */
@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {

    public static final String DEFAULT_ERROR_VIEW = "exception";

    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Object handleOtherExceptions(final Exception exception, final HttpServletRequest request) {
        if(isAjaxRequest(request)) {
            return JSON.toJSONString(“这里是你需要返回的错误json信息”);
        }else{
            ModelAndView mav = new ModelAndView();
            mav.addObject("exception", exception);
            mav.addObject("url", request.getRequestURL());
            mav.setViewName(DEFAULT_ERROR_VIEW);
            return mav;
        }
    }

    /**
     * isAjaxRequest:判断请求是否为Ajax请求. <br/>
     *
     * @param request 请求对象
     * @return boolean
     * @since JDK 1.6
     */
    public boolean isAjaxRequest(HttpServletRequest request){
        String header = request.getHeader("x-requested-with");
        if (null != header && "XMLHttpRequest".endsWith(header)) {
            return true;
        }
        return false;
    }
}

这里需要注意,springboot默认读取static下的静态资源,如需要使用templates下的,需要使用thymeleaf

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

exception.html

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head lang="en">
    <meta charset="UTF-8" />
    <title>异常处理</title>
</head>
<body>
<h1>Error Handler</h1>
<div th:text="'请求路径:' + ${url}"></div>
<div th:text="'异常信息:' + ${exception.message}"></div>
</body>
</html>

测试异常:

@RequestMapping(value = "/", produces = "text/plain;charset=UTF-8")
    ModelAndView index(Date date) throws Exception {
        ModelAndView mav = new ModelAndView();
        mav.setViewName("demo1");
        if (date == null) {
            throw new Exception("测试异常");
        }
        return mav;
    }

 

在使用过程中还发现其他问题:比如MissingServletRequestParameterException的错误并不会如同SpringMVC架构一样返回异常信息,直接是没有返回(当然这不排除是自己不熟的问题)

没有返回的原因,预计是框架吃掉了异常,可参考

 

先说为什么会出现这样的异常呢,比如在你的控制层参数中加入了注解@RequestParam,request为true(默认)的话,而请求又没有传这个参的话,就会发生错误。

这时候,想要自定义全局捕获是不行的,以为会报:模糊不清的启动错误,查出来是因为ResponseEntityExceptionHandler 中存在实现这个异常的捕获。所以多注册一个会报异常

所以直接重构吧(ResponseEntity返回类型可自定义)

 @Override
    protected ResponseEntity<Object> handleMissingServletRequestParameter(MissingServletRequestParameterException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        JSONMessageResponse error = SystemResultUtil.error(5005, "缺少必要参数,参数名称为" + ex.getParameterName());
        return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
    }

 

转载于:https://www.cnblogs.com/skyLogin/p/9178016.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中,可以使用AOP(面向切面编程)来实现统一异常处理。下面是一个简单的示例: 首先,在你的Spring Boot项目中创建一个全局异常处理类,例如 `GlobalExceptionHandler`。 ```java @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ResponseEntity<String> handleException(Exception ex) { // 处理异常逻辑 // 返回自定义的异常信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("发生异常,请联系管理员"); } } ``` 在上面的代码中,我们使用了 `@ControllerAdvice` 注解来标识全局异常处理类,并使用 `@ExceptionHandler` 注解来指定处理的异常类型。 接下来,我们需要在Spring Boot应用程序的入口类上添加 `@EnableAspectJAutoProxy` 注解以启用AOP功能。 ```java @SpringBootApplication @EnableAspectJAutoProxy public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 然后,创建一个切面类来捕获所有被 `@Controller` 或 `@RestController` 注解标识的类中抛出的异常,并将其委托给全局异常处理类进行处理。 ```java @Aspect @Component public class ExceptionAspect { @Autowired private GlobalExceptionHandler globalExceptionHandler; @Pointcut("@within(org.springframework.stereotype.Controller) || @within(org.springframework.web.bind.annotation.RestController)") public void controllerPointcut() {} @AfterThrowing(pointcut = "controllerPointcut()", throwing = "ex") public Object handleException(JoinPoint joinPoint, Exception ex) throws Throwable { return globalExceptionHandler.handleException(ex); } } ``` 在上面的代码中,我们使用 `@Aspect` 注解标识该类为切面类,并使用 `@Component` 注解将其作为Spring组件进行管理。 通过 `@Pointcut` 注解指定切入点,我们选择了所有被 `@Controller` 或 `@RestController` 注解标识的类。 在 `@AfterThrowing` 注解中,我们指定了切入点为 `controllerPointcut()`,并指定了异常类型为 `Exception`,在方法中调用全局异常处理类的方法进行异常处理。 这样,当被 `@Controller` 或 `@RestController` 注解标识的类中抛出异常时,切面类会捕获到异常并委托给全局异常处理类进行处理。 这就是使用AOP实现Spring Boot统一异常处理的基本步骤。你可以根据自己的需求进行扩展和定制化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值