ControllerAdvice 的异常处理程序在使用 Spring Boot 的 Rest API 获取请求中不起作用。如何解决?

Posted

技术标签:

【中文标题】ControllerAdvice 的异常处理程序在使用 Spring Boot 的 Rest API 获取请求中不起作用。如何解决?【英文标题】:Exception Handler of ControllerAdvice Not working in Rest API Get Request using Spring Boot. How to resolve? 【发布时间】:2021-09-20 12:20:11 【问题描述】:

我有一个使用 Spring Boot 的 Rest Controller

@RestController
@RequestMapping("/api")
public class TeamController 

@RequestMapping(value = "/getmember/memberId",method = RequestMethod.GET)
    public ResponseEntity<TeamMember> findmember(@PathVariable("memberId") int theId)
        
        TeamMember teamMember = teamService.findMember(theId);
        if( null == teamMember) 
            throw new TeamMemberNotFoundException();
        
        return new ResponseEntity<TeamMember>(teamMember,HttpStatus.OK);
        
    

我的异常类


@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Member not found")
public class TeamMemberNotFoundException extends RuntimeException 

// constructor


使用 @ControllerAdvice 注释的我的全局异常处理程序

@ControllerAdvice
public class TeamMemberNotFoundExceptionHandler extends ResponseEntityExceptionHandler 
    
    
    @ExceptionHandler(TeamMemberNotFoundException.class)
    public ResponseEntity<TeamMemberNotFoundErrorResponse> handleException(TeamMemberNotFoundException e) 

        TeamMemberNotFoundErrorResponse t = new TeamMemberNotFoundErrorResponse(HttpStatus.NOT_FOUND.value(),"Dude he doesnt exist wake up",System.currentTimeMillis());
        
        return new ResponseEntity<TeamMemberNotFoundErrorResponse>(t, HttpStatus.NOT_FOUND);

    
     
    

当我直接在控制器中使用异常处理程序代码时,它似乎可以工作,但是在使用 @Controller Advice 注释的类中使用异常处理程序时根本不会调用,并且我得到默认的 500 内部服务器错误。我附上了我的项目目录结构的图片。我正在努力但无法解决这个问题

My project directory strcuture

【问题讨论】:

【参考方案1】:

这可能会发生,因为如果您未指定,spring 使用约定优于配置。弹簧检查的包之一是“异常”包,请尝试将您的 ControllerAdvice 放在那里。如果不起作用,请尝试在 Application 类中指定 ControlerAdvice 的包。

【讨论】:

我制作了另一个示例项目,只是为了检查来自控制器建议的全局异常处理程序是否有效,没有使用 Postman 进行任何数据库操作,如果我从请求 URI 中得到“1”作为参数,我抛出了一个自定义异常来自控制器和位于不同包中的全局 ControllerAdvice(具有异常处理程序)(与异常或控制器不在同一个包中,但是 Application 类的子包)。这次奏效了。我猜另一个项目有一些目录或检测控制器建议的问题

以上是关于ControllerAdvice 的异常处理程序在使用 Spring Boot 的 Rest API 获取请求中不起作用。如何解决?的主要内容,如果未能解决你的问题,请参考以下文章

ControllerAdvice 有条件地处理异常

如何优雅地处理 Spring Security 中未由 ControllerAdvice 处理的异常?

@ControllerAdvice 未捕获 Rest API 异常

11.@ControllerAdvice

@ExceptionHandler和@ControllerAdvice统一处理异常

SpringBoot-@ControllerAdvice 拦截异常并统一处理