如何在Spring REST控制器中验证请求参数

时间:2016-07-08 09:38:06

标签: java spring validation exception spring-restcontroller

我正在开发一个Spring REST应用程序 此应用程序只有REST控制器,没有视图部分。

我想知道如何验证@RequestParam

例如

@RequestMapping(value = "", params = "from", method = RequestMethod.GET)
    public List<MealReadingDTO> getAllMealReadingsAfter(@RequestParam(name = "from", required = true) Date fromDate) {
......
......
}

在上面的示例中,我的目标是验证Date。假设有人传递了无效值,那么我应该能够处理这种情况 现在它以500状态给予和例外。

PS
我的问题不仅仅是Date验证 假设有一个boolean参数,有人错误地通过了tru而不是true,我也应该能够处理这种情况。

在此先感谢:)

1 个答案:

答案 0 :(得分:3)

Spring将失败并显示500状态代码,因为它无法解析该值。

请求处理的阶段是:

  1. 接收请求
  2. 识别端点
  3. 解析请求参数/正文值并将它们绑定到检测到的对象
  4. 如果使用@Validated则验证值
  5. 使用适当的参数输入方法调用
  6. 在您的情况下,流程在解析(3)阶段失败。

    很可能您会收到BindException。 您可以通过为控制器提供异常处理程序来处理这些情况。

    @ControllerAdvice
    public class ControllerExceptionHandler {
         @ExceptionHandler(BindException.class)
         @ResponseStatus(HttpStatus.BAD_REQUEST)
         @ResponseBody
         public YourErrorObject handleBindException(BindException e) {
             // the details which field binding went wrong are in the 
             // exception object. 
             return yourCustomErrorData;
         }
    }
    

    否则,当解析没有按预期运行时(尤其是Date s的麻烦),您可能想要添加自定义映射器/序列化器。

    最有可能你必须配置Jackson,因为该软件包负责序列化/反序列化值。