首页 > 解决方案 > 带有无效字符的 Spring Boot 控制器端点请求必须抛出 400 而不是 500?

问题描述

我正在测试一个 Spring Boot 微服务并执行一些安全检查。当我尝试使用无效字符向 URL 发送请求时,例如 https://server/api/dogs/%2500/puppies,您注意到“%2500”无效。服务抛出 500 Internal Server 错误并返回请求中存在无效字符的消息。

有没有办法在我的 Springboot 应用程序中验证请求中的 URL,以便它会抛出 400 Bad Request,而不是 500 Internal Server 错误。

标签: javaspring-boot

解决方案


您可以使用@ControllerAdvice支持通用异常处理机制的注释。

控制器建议允许您使用完全相同的异常处理技术,但将它们应用于整个应用程序,而不仅仅是单个控制器。

您可以将它们视为注释驱动的拦截器。(期待了解更多。)

@ControllerAdvice
class GlobalControllerExceptionHandler {

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(IllegalArgumentException.class)
    public void handleIllegalArgumentException() {
        // Nothing to do ..
    }

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Object> handleMethodArgumentNotValidException(
        MethodArgumentNotValidException e, WebRequest request) {
        Map<String, Object> body = new LinkedHashMap<>();
        body.put("timestamp", LocalDateTime.now());
        body.put("message", "...");
        return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);
    }
}

注意:此处的异常和返回信息是示例。您可以全局包含适合您自己示例的异常。


推荐阅读