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

时间:2019-03-27 07:50:02

标签: java spring-boot spring-web spring-validator

我正在创建一个Spring-Boot微服务REST API,该API期望类型为@RequestParam的{​​{1}}。如何验证列表包含最小和最大数量的值?

到目前为止,我已经尝试使用List<String>,它也应该支持集合(@Size(min=1, max=2))。

我还尝试添加javax.validation.constraints.Size@Valid参数以及BindingResult注释,但没有成功。

我更喜欢使用类似于第一个示例的解决方案,该方案更紧凑,更整洁,使用@Size。这是针对Spring-Boot 2.1.2.RELEASE的。

@Size(min=1, max=2)

我希望能到达@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"); } } } 行,但实际上已被跳过。

3 个答案:

答案 0 :(得分:5)

如果您正在使用方法参数验证,则应使用@Validated注释控制器,如GROUP_CONCAT()所述:

  

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

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

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

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

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

尽管您不能使用BindingResult来检索错误,因为它仅适用于模型属性或请求正文。您可以做的是为ConstraintViolationException定义一个异常处理程序:

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

答案 1 :(得分:0)

您可以使用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(",.,.");
    }

答案 2 :(得分:0)

根据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 element constraints