当前位置: 首页 > 知识库问答 >
问题:

带有无效字符的Spring Boot控制器endpoint请求必须抛出400而不是500?

秦毅
2023-03-14

我正在测试Spring Boot Microservice并执行一些安全检查。

当我尝试将带有无效字符的请求发送到URL的endpoint时,例如https://server/api/dog/%00/upies您注意到“%00”无效。

该服务抛出500内部服务器错误并返回请求中存在无效字符的消息。

是否有办法在我的Spring Boot应用程序中验证请求中的URL,以便它抛出400个错误请求,而不是500个内部服务器错误。

共有1个答案

宗政深
2023-03-14

您可以使用支持通用异常处理程序机制的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);
    }
}

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

 类似资料:
  • 既然我们可以在Javascript中使用关键字抛出任何东西,那么我们就不能直接抛出一个错误消息字符串吗? 有人知道这里面有什么陷阱吗? 让我对此添加一些背景:在JavaScript世界中,人们通常依赖参数检查而不是使用try-catch机制,因此只使用抛出致命错误是有意义的。不过,为了能够捕捉一些系统错误,我必须为我自己的错误使用一个不同的类,而不是创建错误的子类,我认为我应该只使用String。

  • 我知道很多人问过相关的问题,但请帮我解决。我试图复制一个我在网上找到的开源温度控制实验室。我想在树莓皮上运行它。这就是我一直遇到的错误: 生成它的代码如下所示: 我相信这段代码试图通过以下代码与另一个python文件通信: 我还不知道我周围的python代码,所以一个非常清晰的“虚拟类”解决方案的解释会很有帮助。谢谢伙计们。

  • 我使用的是Python3.3,但在尝试pickle一个简单的字典时出现了一个隐秘的错误。 代码如下: 我得到:

  • 问题内容: 我正在尝试使用将以下内容转换为JSON : 但这导致我 该错误很可能是由于dict包含,例如: 有人可以指导我,如何从字典中删除这些元素? 问题答案: 您可以尝试像这样清理它: 这将尝试将不是字符串的任何键转换为字符串。任何无法转换为字符串或不能表示为字符串的键都将被删除。

  • 我想对一个浮点数进行四舍五入,得到点后的两位数。但我收到了一个错误: float()参数必须是字符串或数字,而不是“NoneType” 在评级模型的评级字段中四舍五入是一个坏主意,因为平均_评级不会四舍五入

  • 问题内容: 我已经将脚本从Python 2.7转换为3.2,并且有一个错误。 在最后一行,我得到了这个错误: 我已经安装了Python 3.2,并且已经安装了lxml-2.3.win32-py3.2.exe。 在Python 2.7上可以使用。 问题答案: 输出文件应处于二进制模式。