我的Spring Reactive Web API应该能够基于查询参数进行过滤,但是我正在努力做到这一点。
GET /v1/address?type=business
应该在系统中返回所有类型为“ 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); }); }
我也不能在参数上切换ifEmpty(),因为它抛出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来调用替代方法。例如:
orElse()
orElseGet()
Optional
request .getQueryParam("type") .map(type -> service.getAddressByType(type)) .orElseGet(() -> service.getAllAddresses());
在这种情况下,orElseGet()更有意义,因为它是延迟调用的。请注意,尽管这两个方法应具有相同的返回类型,所以可能是Flux<Address>。
Flux<Address>