gpt4 book ai didi

spring - 路由器功能中的 REST 请求参数验证

转载 作者:行者123 更新时间:2023-12-02 03:44:10 25 4
gpt4 key购买 nike

在Spring Controller 方法中,我们可以使用@Valid和类似的东西来进行REST请求参数验证

@PostMapping(REGISTER)
public ResponseEntity<SomeData> registerSomeData(@RequestBody @Valid final SomeData someData) {
...................
}



public class SomeData {

@Size(min = 2, max = 20)
private String firstname;

@Digits(fraction = 0, integer = 10)
private Integer customerID;

@NotNull
private Customer customer;
}

如果请求与这些约束不匹配,那么 Spring 框架将抛出​​ Bad Request Exception(400)。

使用Spring5路由器函数,我不明白我们如何做到这一点,因为我们不能在路由器函数中给出@Valid

最佳答案

令人有点恼火的是,这个有用的功能似乎没有被带入函数世界,但自己实现验证步骤确实不太难。方法如下。

创建一个 bean 来执行验证:

@Component
public class RequestValidator {

@Inject
Validator validator;

public <T> Mono<T> validate(T obj) {

if (obj == null) {
return Mono.error(new IllegalArgumentException());
}

Set<ConstraintViolation<T>> violations = this.validator.validate(obj);
if (violations == null || violations.isEmpty()) {
return Mono.just(obj);
}

return Mono.error(new ConstraintViolationException(violations));
}
}

现在,在您的处理函数中包含执行验证的步骤。在此示例中,FindRequest 类是一个 JSON 域模型类,其中包含验证注释,例如 @NotEmpty@NotNull 等。调整您的构造方式ServerResponse 基于这个调用响应式(Reactive)数据存储库的虚构示例。

  @Component
public class MyHandler {

@Inject
RequestValidator validator;

public Mono<ServerResponse> findAllPeople(ServerRequest request) {

return request.bodyToMono(FindRequest.class)
.flatMap(this.validator::validate)
.flatMap(fr -> ServerResponse
.ok()
.body(this.repo.findAllByName(fr.getName()), Person.class));
}
}

可以使用相同的方法来扩展处理 Flux 以及 Mono 的功能。

关于spring - 路由器功能中的 REST 请求参数验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47352280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com