gpt4 book ai didi

spring-boot - 响应式 Spring 查询参数

转载 作者:行者123 更新时间:2023-12-02 02:36:27 24 4
gpt4 key购买 nike

我的 Spring Reactive Web API 应该能够根据查询参数进行过滤,但我很难做到这一点。

GET /v1/address?type=business

应返回系统中“业务”类型的所有地址(只是一个示例,因为我没有发布实际要求)。如果参数不存在则返回所有地址。

[
{ "id" : 1, "type" : "business", "street" : "..."},
{ "id" : 2, "type" : "business", "street" : "..."},
...
}

我正在使用路由器函数来映射请求:

public RouterFunction<ServerResponse> route(AddressHandler handler) {
return route(GET("/v1/address"), handler::getAddresses);
}

但我正在努力确定如何检查参数,如果参数不存在,则返回所有地址。

class AddressHandler {
Mono<ServerResponse> getAddressesFilteredOrNot(ServerRequest request) {
Optional<String> addressType = request.getQueryParam("type");

...
}
}

现在,Optional.ifPresent() 不起作用,我无法从该方法返回:

class AddressHandler {
Mono<ServerResponse> getAddressesFilteredOrNot(ServerRequest request) {
Optional<String> addressType = request.getQueryParam("type");

// invalid
addressType.ifPresent(addrType -> {
return ServerResponse.ok()
.body(this.service.getAddressByType(addrType),
Address.class);
});
}

此外,我无法对参数进行 switchIfEmpty(),因为它会抛出 NullPointerException:

class AddressHandler {
Mono<ServerResponse> getAddressesFilteredOrNot(ServerRequest request) {
Optional<String> addressType = request.getQueryParam("type");

// also invalid
return Mono.justOrEmpty(addressType.orElse(""))
.flatMap(addrType -> ServerResponse.ok().body(this.service.getAddressByType(addrType), Address.class)
.switchIfEmpty(ServerResponse.ok().body(this.service.getAllAddresses(), Address.class));
});
}

如果存在查询参数并依赖 getAllAddresses() 方法,那么使用查询参数的流程是什么?这真的可能吗?

最佳答案

您可以使用orElse()orElseGet() Optional的功能调用替代方法。例如:

request
.getQueryParam("type")
.map(type -> service.getAddressByType(type))
.orElseGet(() -> service.getAllAddresses());

在本例中,orElseGet()更有意义,因为它是延迟调用的。请注意,这两种方法应该具有相同的返回类型,因此可能 Flux<Address> .

关于spring-boot - 响应式 Spring 查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49043664/

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