首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reactive Spring查询参数

Reactive Spring查询参数
EN

Stack Overflow用户
提问于 2018-03-01 14:16:01
回答 1查看 10.1K关注 0票数 2

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

代码语言:javascript
复制
GET /v1/address?type=business

应该返回系统中所有'business‘类型的地址(这只是一个例子,因为我并没有发布实际的需求)。如果参数不存在,则只返回所有地址。

代码语言:javascript
复制
[
  { "id" : 1, "type" : "business", "street" : "..."},
  { "id" : 2, "type" : "business", "street" : "..."},
  ...
}

我使用Router函数来映射请求:

代码语言:javascript
复制
public RouterFunction<ServerResponse> route(AddressHandler handler) {
    return route(GET("/v1/address"), handler::getAddresses);
}

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

代码语言:javascript
复制
class AddressHandler {
    Mono<ServerResponse> getAddressesFilteredOrNot(ServerRequest request) {
        Optional<String> addressType = request.getQueryParam("type");

        ...
    }
}

现在Optional.ifPresent()不起作用了,我不能从这个方法返回:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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()方法,那么使用查询参数的流程是什么?这真的可能吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-01 15:34:52

您可以使用OptionalorElse()orElseGet()功能来调用替代方法。例如:

代码语言:javascript
复制
request
    .getQueryParam("type")
    .map(type -> service.getAddressByType(type))
    .orElseGet(() -> service.getAllAddresses());

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49043664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档