springMVC @RestControllerAdvice注解使用方式

 更新时间:2024年08月06日 10:51:04   作者:angen2018  
这篇文章主要介绍了springMVC @RestControllerAdvice注解使用方式,下面通过一个简单的示例,演示如何使用 @RestControllerAdvice,感兴趣的朋友跟随小编一起看看吧

使用 @RestControllerAdvice 的主要场景包括:

  • 全局异常处理:处理所有控制器中抛出的未捕获异常。
  • 数据校验失败处理:处理 Bean Validation 校验失败的情况。
  • 自定义响应:统一定义响应格式或错误信息。

@RestControllerAdvice 注解的类通常与以下组件结合使用:

  • @ExceptionHandler:用于处理特定的异常类型。
  • @ResponseStatus:用于定义异常的HTTP状态。
  • @ExceptionHandler 方法可以访问异常对象、请求对象(WebRequest)、响应对象等,以构造合适的响应。

以下是一个简单的示例,演示如何使用 @RestControllerAdvice

java

import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
    // 处理自定义异常
    @ExceptionHandler(CustomException.class)
    public ResponseEntity<String> handleCustomException(CustomException ex, WebRequest request) {
        // 构造错误信息
        String error = "An error occurred: " + ex.getMessage();
        return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
    }
    // 可以添加更多的异常处理方法
}

在这个示例中,GlobalExceptionHandler 类使用 @RestControllerAdvice 注解标记,使其成为全局异常处理器。类中的 handleCustomException 方法使用 @ExceptionHandler 注解标记,用于处理 CustomException 类型的异常。

使用 @RestControllerAdvice 可以集中处理异常,使控制器代码更简洁、更专注于业务逻辑,同时提高异常处理的可维护性。

一个模拟权限校验的案例

首先自定义一个权限不够的异常

public class PermissionException extends Exception{
    // 构造函数
    public PermissionException() {
        super();
    }
    public PermissionException(String message) {
        super(message);
    }
    public PermissionException(String message, Throwable cause) {
        super(message, cause);
    }
    public PermissionException(Throwable cause) {
        super(cause);
    }
}

然后用注解的方式写一个异常处理类

@RestControllerAdvice
public class PermissionExceptionHandler {
    @ExceptionHandler(PermissionException.class)
    public Map handleMyCustomException(PermissionException ex) {
        Map<String, String> msg = new HashMap<>();
        msg.put("status","500");
        msg.put("msg","错误,没有权限");
        return  msg;
    }
}

然后写一个处理权限校验的拦截器

/*
* preHandle在执行处理器方法之前执行
* postHandle在执行处理器方法之后执行
* afterCompletion在这次请求完成后执行
* */
@Component
public class PermissionInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String auth = request.getParameter("auth");
        System.out.println(auth);
        if ("0".equals(auth)){
            throw new PermissionException();
        }
        //返回true放行,返回false不放行
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

然后把拦截器注册到spring中

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private HandlerInterceptor permissionInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(permissionInterceptor)
                .addPathPatterns("/**") // 拦截所有请求
                .excludePathPatterns("/ignoreThis"); // 排除不需要拦截的请求
    }
}

然后你请求http://localhost:8080/user/1?auth=1

你会发现auth=1的时候拦截器放行

auth=0的时候会被拦截器拦截,并且抛出我们自定义的异常,然后自定义异常会被我们写的异常处理器监听到,最终给客户端返回没有权限 

到此这篇关于springMVC @RestControllerAdvice注解使用方式的文章就介绍到这了,更多相关springMVC @RestControllerAdvice注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 解决Mybatis的serverTimezone时区出现问题

    解决Mybatis的serverTimezone时区出现问题

    这篇文章主要介绍了解决Mybatis的serverTimezone时区出现问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 浅谈一下Java中枚举的用法

    浅谈一下Java中枚举的用法

    这篇文章主要介绍了浅谈一下Java中枚举的用法,枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数,当一个变量有几种固定可能的取值时,就可以将它定义为枚举类型,需要的朋友可以参考下
    2023-04-04
  • Java源码解析HashMap的keySet()方法

    Java源码解析HashMap的keySet()方法

    今天小编就为大家分享一篇关于Java源码解析HashMap的keySet()方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • java 验证码的生成实现

    java 验证码的生成实现

    这篇文章主要介绍了java 验证码的生成实现的相关资料,需要的朋友可以参考下
    2017-08-08
  • Spring Boot FeignClient 如何捕获业务异常信息

    Spring Boot FeignClient 如何捕获业务异常信息

    这篇文章主要介绍了Spring Boot FeignClient 如何捕获业务异常信息的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring AOP 创建代理对象详情

    Spring AOP 创建代理对象详情

    这篇文章介绍了Spring AOP 创建代理对象详情,主要介绍AOP 创建代理对象和上下文相关的内容,下文分享具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05
  • SpringMVC注解@CrossOrigin跨域问题详解

    SpringMVC注解@CrossOrigin跨域问题详解

    这篇文章主要介绍了SpringMVC注解@CrossOrigin跨域问题详解,跨域是浏览同源策略的造成,是浏览器对JavaScript施加的安全限制CORS是一种可以解决跨域问题的技术,需要的朋友可以参考下
    2023-11-11
  • java中你的项目应该如何正确分层

    java中你的项目应该如何正确分层

    这篇文章主要介绍了java中你的项目应该如何正确分层,业务分层对于代码规范是比较重要,决定着以后的代码是否可复用,感兴趣的可以了解一下
    2021-04-04
  • springboot操作ldap全过程

    springboot操作ldap全过程

    这篇文章主要介绍了springboot操作ldap全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • SpringBoot使用SSE进行实时通知前端的实现代码

    SpringBoot使用SSE进行实时通知前端的实现代码

    这篇文章主要介绍了SpringBoot使用SSE进行实时通知前端,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06

最新评论