我的全局异常捕获类如下:
package com.ttyc.bgsystem.exception.handler; import com.ttyc.bgsystem.domain.enums.HttpCodeEnum; import com.ttyc.bgsystem.domain.vo.ResponseResult; import com.ttyc.bgsystem.exception.ServiceException; import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.naming.AuthenticationException; /** * 全局异常捕获 * */ @ControllerAdvice @Slf4j public class GlobalExceptionHandler { //捕获自定义异常 @ExceptionHandler(ServiceException.class) public ResponseResult serviceExceptionHandler(ServiceException e){ //打印异常信息 log.error("出现了异常:"+e.getMessage()); //从异常对象中获取提示信息封装返回 return ResponseResult.error(e.getCode(),e.getMessage()); } }
该异常捕获在和springsecurity的自定义异常捕获同时使用时,产生了先执行全局异常捕获后,springsecurity的自定义异常将全局异常捕获return的内容变成了
InsufficientAuthenticationException异常
解决方法:将全局异常捕获的@ControllerAdvice改为@RestControllerAdvice,因为@ControllerAdvice返回的是一个视图,该视图被springsecurity认为是受保护的资源,导致进入springsecurity的认证鉴权流程,而修改成@RestControllerAdvice后,返回的是json数据,不会被springsecurity拦截