【问题标题】:Interceptor and global exception handling拦截器和全局异常处理
【发布时间】:2021-04-12 10:36:10
【问题描述】:

我有一个后拦截器。当控制层执行并返回信息时,将执行后拦截器。此时,post-interceptor 中的异常会被全局异常处理捕获并返回提示信息。使用“postman”测试控制层和全局异常处理的信息同时返回。这真的回来了吗?我写了一个测试示例。同样的情况,只返回控制层的信息。我认为它应该返回全局异常处理的信息。

控制器

@RestController
@RequestMapping("/v1/book")
@Validated
public class BookController {

    private final BookService bookService;

    public BookController(BookService bookService) {
        this.bookService = bookService;
    }

    @GetMapping("/search")
    public R searchBook(@RequestParam(value = "q", required = false, defaultValue = "") String q) {
        return R.select(bookService.getBookByKeyword(q));
    }
}

拦截器

public class LogInterceptor extends HandlerInterceptorAdapter {

    public LogInterceptor(LoggerResolver loggerResolver) {
        this.loggerResolver = loggerResolver;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
        // There will be a runtime exception here
    }
}

全局异常处理

@Order
@RestControllerAdvice
@Slf4j
public class RestExceptionHandler {

    /**
     * Exception
     */
    @ExceptionHandler({Exception.class})
    public R processException(Exception exception) {
        log.error("", exception);
        return R.error();
    }
}

结果

{
    "code": 200,
    "data": [
        // ...
    ],
    "type": "success",
    "message": "OK"
}{
    "code": 500,
    "type": "error",
    "message": "Internal Server Error"
}

“R extends HashMap”,用于统一返回结构。

【问题讨论】:

    标签: spring-boot exception interceptor


    【解决方案1】:

    查看您的代码 sn-p,我不确定 searchBook 和 processException 中的那些 R 是什么

    试试这个(编辑 processException 以满足您的规范):

    @GetMapping("/search")
    public ResponseEntity<?> searchBook(@RequestParam(value = "q", required = false, defaultValue = "") String q) {
        return new ResponseEntity<>(bookService.getBookByKeyword(q), HttpStatus.OK);
    }
    
    @ExceptionHandler({Exception.class})
    public ResponseEntity<?> processException(Exception exception) {
        return new ResponseEntity<>(new ErrorDTO(exception.getMessage()), HttpStatus.UNPROCESSABLE_ENTITY);
    }
    

    【讨论】:

    • "R extends HashMap",用于统一返回结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    • 2017-02-09
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多