繁体   English   中英

Spring 引导 - 也为参数 TYPE 请求正文验证

[英]Spring Boot - request body validation also for parameter TYPE

我想知道如何为参数类型添加验证:我有端点:

    @PostMapping(consumes = "application/json", path = "/v2/tw")
    @ResponseStatus(HttpStatus.CREATED)
    public TwDto add(
            Authentication auth,
            @Validated(TwDto.New.class) @RequestBody TwDto twDto,
            BindingResult bindingResult) {

TwDto 有里面

    @Valid
    @PositiveOrZero
    @Pattern(regexp = "[0-9]", message = "id must be a number")
    private Long storeId;

当我设置storeId = "123someString"时,我总是收到 400 错误而没有任何消息。

我想发送给客户,例如。 带有一些消息的404 eror代码 - 怎么做? 我尝试了很多选项,但总是收到400 BAD REQUEST ...

或者也许我应该通过一些 dto 字段进行自定义验证,例如 go 并在 try catch 检查 storeId 是否为数字,然后抛出一些将在 ExceptionHandler 中捕获的错误?

@Pattern(regexp = "[0-9]", message = "id must be a number")不起作用,我没有看到任何应该返回错误的消息

如果要保持自动验证,可能需要将 storeId 的类型更改为 String:

@Valid
@Pattern(regexp = "[0-9]*", message = "id must be a number")
private String storeId; 

然后验证将起作用:

public class TwDtoTest {
    @Test
    void invalid_store_test() {
        TwDto twDto = new TwDto();
        twDto.setStoreId("aaaa");
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<TwDto>> violations = validator.validate(twDto);

        assertThat(violations.size()).isEqualTo(1);
        violations.forEach(violation -> assertThat(
            violation.getMessage()).isEqualTo("id must be a number")
        );
    }

    @Test
    void valid_store_test() {
        TwDto twDto = new TwDto();
        twDto.setStoreId("10");
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<TwDto>> violations = validator.validate(twDto);

        assertThat(violations.size()).isEqualTo(0);
    }
}

当然,如果您需要将 storeId 保存或使用为 Long,则需要将其转换: Long.parseLong(storeId)

暂无
暂无

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

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