首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写“无功”WebFlux控制器

写“无功”WebFlux控制器
EN

Stack Overflow用户
提问于 2020-12-25 15:36:58
回答 2查看 346关注 0票数 0

我正在尝试将WebMVC控制器转换为返回Mono<Resource>的WebFlux控制器。

旧的WebMVC控制器如下所示。

代码语言:javascript
复制
@GetMapping("/resources/{id}")
public ResponseEntity<Resource> getCustomer(@RequestParam String id) {
    if(id.length != 10) {
        // set ResponseEntity status 400 and then return it
    }

    val resource = resourceService.getResourceById(id);    
    return ResponseEntity.ok().body(resource);
}

如何使if块与Reactive Programming更兼容

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-26 03:30:19

如果您使用的是函数式端点,您可以这样做。

代码语言:javascript
复制
public Mono<ServerResponse> getCustomer(ServerRequest serverRequest) {

  if (serverRequest.pathVariable("id").length() != 10) {

    return ServerResponse
        .status(400)
        .build();

  } else {

    return ServerResponse
        .ok()
        .body(
            resourceService.getResourceById(serverRequest.pathVariable("id")),
            Resource.class
        );

  }

}

上面提到的对我来说更容易读懂。但是,您可以从Mono.just(serverRequest.pathVariable("id"))开始,如果您真的想维护流,即使在方法中也是如此,如下所示。

代码语言:javascript
复制
return Mono.just(serverRequest.pathVariable("id"))
  .filter(id -> id.length() == 10)
  .flatMap(resourceService::getResourceById)
  .flatMap(resource -> ServerResponse
      .ok()
      .body(
          resourceService.getResourceById(serverRequest.pathVariable("id")),
          Resource.class
      )
  )
  .switchIfEmpty(ServerResponse.status(400).build());

类似地,如果您使用带注释的控制器,下面这样的内容似乎更易读(对我来说:)。

代码语言:javascript
复制
@GetMapping(path = "/resources/{id}")
public ResponseEntity<Mono<Resource>> getCustomer(@PathVariable String id) {

  if (id.length() != 10) {

    return ResponseEntity
            .status(400)
            .build();

  } else {

    return ResponseEntity
        .ok()
        .body(resourceService
            .getResourceById(id));

  }

}

正式文档是一个很好的参考:文档中的两个相关部分。

  1. https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-controller
  2. https://docs.spring.io/spring-framework/docs/current/reference/html/web-reactive.html#webflux-fn
票数 3
EN

Stack Overflow用户

发布于 2021-01-12 10:48:24

U需要创建网络流量功能流的处理程序,路由器。

代码语言:javascript
复制
@Component

公共类SampleHandlerFunction {

代码语言:javascript
复制
public Mono<ServerResponse> flux(ServerRequest serverRequest) {

    return ServerResponse.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .body(
                    Flux.just(1, 2, 3, 4)
                            .log(), Integer.class
            );
}

public Mono<ServerResponse> mono(ServerRequest serverRequest) {

    return ServerResponse.ok()
            .contentType(MediaType.APPLICATION_JSON)
            .body(
                    Mono.just(1)
                            .log(), Integer.class
            );
}

路由器

代码语言:javascript
复制
@Configuration

公共类RouterFunctionConfig {

代码语言:javascript
复制
@Bean
public RouterFunction<ServerResponse> route(com.Reactive.SpringReactive.handler.SampleHandlerFunction handlerFunction){

    return RouterFunctions
            .route(GET("/functional/flux").and(accept(MediaType.APPLICATION_JSON)),handlerFunction::flux)
            .andRoute(GET("/functional/mono").and(accept(MediaType.APPLICATION_JSON)),handlerFunction::mono);

}

}

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

https://stackoverflow.com/questions/65449469

复制
相关文章

相似问题

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