繁体   English   中英

如何验证List类型的@RequestParam的大小

[英]How to validate the size of @RequestParam of type List

我正在创建一个Spring-Boot微服务REST API,它需要类型为List<String> @RequestParam 如何验证列表是否包含最小值和最大值?

到目前为止,我已经尝试使用@Size(min=1, max=2) ,它也应该支持集合( javax.validation.constraints.Size )。

我还尝试添加@ValidBindingResult参数以及@Size注释,但没有成功。

我更喜欢使用类似于第一个例子的解决方案,使用@Size(min=1, max=2) ,它更紧凑,更整洁。 这是针对Spring-Boot 2.1.2.RELEASE。

@RestController
public class MyApi {

    @GetMapping(value = "/myApi", produces = { APPLICATION_JSON_VALUE })
    public ResponseEntity<List<MyObject>> getSomething(@Valid @RequestParam(value = "programEndTime", required = false) @Size(min = 1, max = 2) List<String> programEndTime, BindingResult result) {
        if (result.hasErrors()) {
            System.out.println("Error");
        } else {
            System.out.println("OK");
        }
    }
}

我希望达到System.out.println("Error")行,但实际上它已被跳过。

如果您正在使用方法参数验证,则应使用@Validated对控制器进行@Validated ,如文档中所述

要获得Spring驱动的方法验证资格,所有目标类都需要使用Spring的@Validated注释进行注释。 (或者,您也可以声明要使用的验证组。)请参阅MethodValidationPostProcessor javadoc以获取有关Hibernate Validator和Bean Validation 1.1提供程序的设置详细信息。

这意味着您应该将代码更改为:

@Validated // Add this
@RestController
public class MyApi {
    // ...
}

之后,如果验证不匹配,它将抛出ContraintViolationException

但请注意,由于您只有@Size()注释,如果您不提供programEndTime ,该集合将为null并且该集合也将是有效的。 如果您不想这样做,您还应该添加@NotNull注释,或者从@RequestParam删除required = false值。

但是,您无法使用BindingResult来检索错误,因为这仅适用于模型属性或请求主体。 你可以做的是为ConstraintViolationException定义一个异常处理程序:

@ExceptionHandler(ConstraintViolationException.class)
public void handleConstraint(ConstraintViolationException ex) {
    System.out.println("Error");
}

您可以使用Class和@RequestBody进行参数验证,这与我一样成功。

public class Test {
    @Size(min = 1 , max = 5)
    private List<String> programEndTime;

    public List<String> getProgramEndTime() {
        return programEndTime;
    }

    public void setProgramEndTime(List<String> programEndTime) {
        this.programEndTime = programEndTime;
    }
}
    @PostMapping("test")
    public void test( @Valid   @RequestBody Test test,
                     BindingResult result){
        if (result.hasErrors()) {
            System.out.println("Error");
        } else {
            System.out.println("OK");
        }
        System.out.println(",.,.");
    }

根据Bean Validator 2.0,Hibernate Validator 6.x,您可以直接在参数化类型上使用约束。

@GetMapping(path = "/myApi", produces = { APPLICATION_JSON_VALUE })
public ResponseEntity<List<MyObject>> getSomething(@RequestParam(value = "programEndTime", required = false) List<@Size(min = 1, max = 2) String> programEndTimes)

有关更多信息,请查看Container元素约束

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM