Spring Boot中使用AOP统一处理web层异常的方法

在springboot错误默认是跳转到 请求返回渲染路径中的error/错误页面中。

源码分析:DefaultErrorViewResolver.java

 private ModelAndView resolve(String viewName, Map<String, Object> model) {
 String errorViewName = "error/" + viewName;
 TemplateAvailabilityProvider provider = this.templateAvailabilityProviders
  .getProvider(errorViewName, this.applicationContext);
 if (provider != null) {
  return new ModelAndView(errorViewName, model);
 }
 return resolveResource(errorViewName, model);
 }

比如在application.properites中配置渲染页面为

#配置freemaker
spring.freemarker.template-loader-path=/WEB-INF/

如果不配置spring.freemarker.template-loader-path,springboot会在src/main/resources中的templates中的error文件下下找错误渲染的页面。

那么当出现错误时,系统会跳转到/WEB-INF/error/错误页面中。

使用AOP进行web层异常处理

package com.niugang.aop;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.servlet.ModelAndView;
/**
 * controller层统一异常处理
 *
 * @author niugang
 *
 */
@Aspect
@Component
public class ExceptionControllerAscept {
 private Logger logger = LoggerFactory.getLogger(ExceptionControllerAscept.class);
 /**
 * 匿名切点的方式
 *
 * @param ex
 * @throws ServletException
 * @throws IOException
 */
 @AfterThrowing(value = "execution(public * com.niugang.controller..*.*(..))", throwing = "ex")
    public ModelAndView aroundAdvice(Exception ex) throws ServletException, IOException {
 ModelAndView modelAndView = new ModelAndView();
 RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
 ServletRequestAttributes r = (ServletRequestAttributes) requestAttributes;
 HttpServletRequest request = r.getRequest();
 modelAndView.setViewName("500");
 // 第一如果是 RuntimeException
 if (ex instanceof RuntimeException) {
  logger.error("抛出运行时异常{}", ex.getMessage());
  modelAndView.addObject("exception", ex.getMessage());
  // 跳转到错误页面
  modelAndView.addObject("url", request.getRequestURL());
  return modelAndView;
 }
 modelAndView.addObject("exception","未知异常");
 return modelAndView;
 }
}

总结

以上所述是小编给大家介绍的Spring Boot中使用AOP统一处理web层异常,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • 详解Springboot自定义异常处理

    背景 Springboot 默认把异常的处理集中到一个ModelAndView中了,但项目的实际过程中,这样做,并不能满足我们的要求.具体的自定义异常的处理,参看以下 具体实现 如果仔细看完spring boot的异常处理详解,并且研究过源码后,我觉得具体的实现可以不用看了... 重写定义错误页面的url,默认只有一个/error @Bean public EmbeddedServletContainerCustomizer containerCustomizer(){ return new E

  • spring boot请求异常处理并返回对应的html页面

    通过之前的学习,我知道中间件可以预处理http请求并返回相应页面(比如出现404异常,可以返回一个自己编写的异常界面,而非默认使用的白板404页面,很难看).其实spring boot也提供了这样的功能. 404异常处理: @Controller public class ErrorHandler404 implements ErrorController { private static final String ERROR_PATH = "/error"; @RequestMapp

  • springboot全局异常处理详解

    一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import

  • Spring Boot统一异常处理详解

    Spring Boot中默认带了error的映射,但是这个错误页面显示给用户并不是很友好. 统一异常处理 通过使用@ControllerAdvice定义统一异常处理的类,而不是在每个Controller中逐个定义. @ExceptionHandler用来定义函数针对的函数类型,最后将Exception对象和请求URL映射到URL中. @ControllerAdvice class ExceptionTranslator { public static final String DEFAULT_E

  • SpringBoot初始教程之统一异常处理详解

    1.介绍 在日常开发中发生了异常,往往是需要通过一个统一的异常处理处理所有异常,来保证客户端能够收到友好的提示.SpringBoot在页面发生异常的时候会自动把请求转到/error,SpringBoot内置了一个BasicErrorController对异常进行统一的处理,当然也可以自定义这个路径 application.yaml server: port: 8080 error: path: /custom/error BasicErrorController提供两种返回错误一种是页面返回.当

  • 如何优雅的处理Spring Boot异常信息详解

    Spring Boot 异常处理 异常处理是一种识别并响应错误的一致性机制,异常机制可以把程序中的异常处理代码和正常的业务逻辑代码分离,包装程序的可读性和健壮性.在Spring Boot应用程序中,能够捕获并及时的响应客户端的错误操作是一件非常重要的事情.在本章节中,我将展示如何处理Spring Boot中的异常. 1. 相关注解说明 在进行演示之前,我们先了解一下在Spring Boot应用程序中与异常处理相关的几个注解 注解名称 说明 @ControllerAdvice 该标签用于处理全局的

  • Spring Boot全局异常处理解析

    本文为大家分享了Spring Boot全局异常处理,供大家参考,具体内容如下 1.后台处理异常 a.引入thymeleaf依赖 <!-- thymeleaf模板插件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>

  • SpringBoot学习之全局异常处理设置(返回JSON)

    SpringBoot学习--全局异常处理设置(返回JSON) 需求 现在习惯使用ajax的方式发起请求,所以经常需要服务端返回一个json或者字符串. 控制全局的异常处理. 如果在单个方法中使用try,catch把方法包裹起来,工作量大,而且会异常的抛出而导致@Transactional注解的方法事务不会回滚. 说明 使用@ControllerAdvice注解 使用@ExceptionHandler注解 @ControllerAdvice 该注解是spring2.3以后新增的一个注解,主要是用来

  • Spring Boot学习入门之统一异常处理详解

    前言 关于之前的一篇所讲到的表单验证中提到,如果产生错误,可以得到错误的信息,但是返回值的问题却没有考虑. 其中所提到的Controller: @RequestMapping(value = "/doRegister", method = RequestMethod.POST) public @ResponseBody User doRegister(@Valid User user, BindingResult result, Model model) { if (result.ha

  • 浅谈Spring Boot 异常处理篇

    前言 先谈谈"异常处理"这件事.下面有 2 份伪代码,对比下: // ① 基于 if/else 判断 if(deletePage(page) == E_OK){ if(registry.deleteReference(page.name) == E_OK){ if(configKeys.deleteKey(page.name.makeKey()) == E_OK){ logger.log("page deleted"); }else{ logger.log(&quo

随机推荐