反应式 Spring 查询参数
Reactive Spring Query Parameters
我的 Spring Reactive Web API 应该能够根据查询参数进行过滤,但我正在努力做到这一点。
GET /v1/address?type=business
应该return系统中所有'business'类型的地址(只是一个例子,因为我没有发布实际要求)。如果参数不存在,则仅 return 所有地址。
[
{ "id" : 1, "type" : "business", "street" : "..."},
{ "id" : 2, "type" : "business", "street" : "..."},
...
}
我正在使用路由器功能来映射请求:
public RouterFunction<ServerResponse> route(AddressHandler handler) {
return route(GET("/v1/address"), handler::getAddresses);
}
但我正在努力确定如何检查参数,如果不存在,则检查 return 所有地址。
class AddressHandler {
Mono<ServerResponse> getAddressesFilteredOrNot(ServerRequest request) {
Optional<String> addressType = request.getQueryParam("type");
...
}
}
现在 Optional.ifPresent() 不起作用,我不能 return 从方法:
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() 方法,使用查询参数的流程是什么?真的可以吗?
您可以使用 Optional
的 orElse()
或 orElseGet()
功能来调用替代方法。例如:
request
.getQueryParam("type")
.map(type -> service.getAddressByType(type))
.orElseGet(() -> service.getAllAddresses());
在这种情况下,orElseGet()
更有意义,因为它是延迟调用的。请注意,尽管这两种方法应该具有相同的 return 类型,所以可能 Flux<Address>
.
我的 Spring Reactive Web API 应该能够根据查询参数进行过滤,但我正在努力做到这一点。
GET /v1/address?type=business
应该return系统中所有'business'类型的地址(只是一个例子,因为我没有发布实际要求)。如果参数不存在,则仅 return 所有地址。
[
{ "id" : 1, "type" : "business", "street" : "..."},
{ "id" : 2, "type" : "business", "street" : "..."},
...
}
我正在使用路由器功能来映射请求:
public RouterFunction<ServerResponse> route(AddressHandler handler) {
return route(GET("/v1/address"), handler::getAddresses);
}
但我正在努力确定如何检查参数,如果不存在,则检查 return 所有地址。
class AddressHandler {
Mono<ServerResponse> getAddressesFilteredOrNot(ServerRequest request) {
Optional<String> addressType = request.getQueryParam("type");
...
}
}
现在 Optional.ifPresent() 不起作用,我不能 return 从方法:
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() 方法,使用查询参数的流程是什么?真的可以吗?
您可以使用 Optional
的 orElse()
或 orElseGet()
功能来调用替代方法。例如:
request
.getQueryParam("type")
.map(type -> service.getAddressByType(type))
.orElseGet(() -> service.getAllAddresses());
在这种情况下,orElseGet()
更有意义,因为它是延迟调用的。请注意,尽管这两种方法应该具有相同的 return 类型,所以可能 Flux<Address>
.