[英]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.