【问题标题】:Spring MVC REST not null constraint does not work on missing request paramSpring MVC REST not null 约束不适用于缺少请求参数
【发布时间】:2019-09-06 07:58:55
【问题描述】:

非空验证不适用于案例:

@RestController
public class BookController {

 @GetMapping("/api/books/search")
 public Page<Book> get(@RequestParam(name = "bookId") @Valid @NotNull Long bookId, Pageable pageable) {
     .... // #1
 }
}

如果我打电话给GET http://localhost:8080/api/books/search?bookId= bookId 在第 1 行为空。这是奇怪的行为,因为如果我不提供 bookId 它会失败。 @NotNull 验证未触发。

【问题讨论】:

  • 内部控制器if(bookId == null){//Do whatever you want}
  • @SudhirOjha 如果此类参数的值不能为空,那么最好依赖 Bean Validation。看看我的answer

标签: rest spring-boot spring-mvc


【解决方案1】:

@NotNull 验证未触发。

当你想触发验证时,控制器类必须用@Validated注解:

@Validated
@RestController
public class BookController {
   ...
}

引用documentation

要符合 Spring 驱动的方法验证条件,所有目标类都需要使用 Spring 的 @Validated 注释进行注释。


@RequestParam 注释有一个required 元素,默认值为true。它只是表明参数本身必须存在于 URL 中(?id?id=),但它不需要该参数的非空值。如果您需要验证此类参数的值,则应使用 Bean Validation 注解。

例如,考虑以下控制器方法:

@GetMapping("/foo")
public ResponseEntity<Foo> get(@RequestParam("id") Long id) {
    ...
}

以下请求将产生带有400 状态代码的响应,因为id 参数不存在:

GET /foo HTTP/1.1
Host: example.org

另一方面,以下请求被认为是有效的,因为存在id 参数(即使没有与之关联的值):

GET /foo?id HTTP/1.1
Host: example.org

要拒绝null 值,请使用@NotNull 注释(并确保控制器类使用@Validated 注释):

@GetMapping("/foo")
public ResponseEntity<Foo> get(@RequestParam("id") @NotNull Long id) {
    ...
}

【讨论】:

  • @Validated 有效,但奇怪的是为什么 @RequestParam required true 没有被触发
  • @idmitriev required = true 表示参数本身必须存在于 URL (?id) 中,但该参数不需要非空值。
【解决方案2】:

有不同的概念。使用 @RequestParam 注释的方法参数默认是必需的。您可以设置 @RequestParam(required = false) 来禁用它。

但是,您的参数是 Long(对象)类型。你不能给它,然后默认它会是空的(因为你没有设置一个默认值 - 比如@RequestParam(defaultValue = ))。

最好的方法是设置一个默认值或在你的方法中检查 null。

【讨论】:

  • required = true 表示参数本身是必需的(不是值)。详情请见我的answer
猜你喜欢
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多