响应式 Spring 查询参数

2024-03-12

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

GET /v1/address?type=business

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

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

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

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() or orElseGet()的功能Optional调用替代方法。例如:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

响应式 Spring 查询参数 的相关文章

随机推荐