当前位置: 首页 > 知识库问答 >
问题:

Spring 5 WebFlux中@Controller和RouterFunction的

殷永嘉
2023-03-14

现在Spring5中有两种公开HTTPendpoint的方法。

    null
@RestController
@RequestMapping("persons")
public class PersonController { 

    @Autowired
    private PersonRepo repo;

    @GetMapping("/{id}")
    public Mono<Person> personById(@PathVariable String id){
        retrun repo.findById(id);
    }
}
@Bean
public RouterFunction<ServerResponse> personRoute(PersonRepo repo) {
    return route(GET("/persons/{id}"), req -> Mono.justOrEmpty(req.pathVariable("id"))                                             
                                                 .flatMap(repo::getById)
                                                 .flatMap(p -> ok().syncBody(p))
                                                 .switchIfEmpty(notFound().build()));
}

使用任何人的方法是否有性能差异?从头开始编写应用程序时,我应该使用哪一个。

共有1个答案

柳奇希
2023-03-14

对于@controller@restcontroller注释,我们同意基于注释的模型,在该模型中,我们将注释用于映射(而且不仅仅用于映射),并因此产生副作用(这在函数世界中是不允许的)以使API工作。这种副作用可能是@valid注释,它为请求主体提供内置bean验证,或者@requestmapping带有整个控制器的根路径。

另一方面,通过路由器函数,我们去掉了包含API实现方面任何副作用的注释,并将其直接委托给函数链:router->handler。这两个非常适合构建基本的反应块:一个事件序列和两个主角,一个发布者和一个订阅者。

当我们讨论@controller时,我想说我们通常会从同步Java世界的角度考虑:servletsServletContextServletContextServletContinitializerDispatcherServlet等。即使我们会从控制器返回mono,以使应用程序具有反应性,我们仍然会使用Servlet3.0规范,该规范支持随后,我们将使用相应的设计模式和方法来构建web应用程序。

另一方面,RouterFunction受到源自异步Java World-Netty及其信道模型的真正反应性方法的启发。

随后出现了一组新的用于反应环境的类及其API:ServerRequest、ServerResponse、WebFilter等。就我而言,它们是Spring团队根据前几年维护框架和理解新的web系统需求而设计的。这些要求的名称是反应宣言。

最近,我的团队面临着无法将Swagger与RouterFucntionendpoint集成的问题。它可能会支持@controlers,但Spring团队引入了他们的解决方案--Spring REST文档,该文档可以轻松地连接到反应式WebTestClient。我在这里使用“connected”这个词是因为它背后包含了真正的反应性含义:您可以轻松地在测试中构建API文档,而不必大摇大摆地使用过载的配置和副作用注释,而不必接触您的工作代码。

更新2020:尽管现在Spring Webflux已经可以使用OpenAPI规范与Swagger集成,但它仍然缺乏配置的简单性和透明度,在我看来,这是作为过时的MVC方法的一部分的结果。

由于没有性能影响,它可能会听到类似于“它绝对基于个人偏好使用什么”的内容。我同意,这确实是个人偏好,在两种选择中:前进或后退,当你让自己在同一个领域呆上十年。我认为Spring团队对@controller的反应性支持是为了使旧项目能够以某种方式与时间需求保持一致,并至少有机会进行迁移。如果您要从头创建web应用程序,那么不要犹豫,使用引入的Reactor栈。

 类似资料:
  • 如何在Spring5WebFlux项目中启用CORS? 我找不到合适的留档。

  • 这些是实现控制器类 然而,当我们在Spring MVC程序中使用@Controller注释时,如何知道我们的@Controller注释正在实现这些控制器中的任何一个

  • 我是Spring gateway cloud(Spring Reactor)的新手。我想实现聚合层,它将从两个微服务(如RealAPI gateway)下载数据。据我所知,在Spring Cloud Gateway中,它需要以反应式方式实现。 我发现RouterFunction可以创建一个网关endpoint来实现POST到其中一个微服务。它可以工作,但当微服务返回BAD_状态或其他时,我的spr

  • 我正在尝试在我的WebClient上设置超时,以下是当前代码: 我需要添加超时和池策略,我在想这样的事情: 但是我不知道如何在我的webclient中设置httpClient

  • 问题内容: 有时我看到但更多 在我已经用这似乎很清楚。但是..是为了什么? 它们之间有什么区别,在哪里使用什么? 问题答案: Angularjs使用规范化过程来进行指令名称/属性匹配。 从位于http://docs.angularjs.org/guide/directive的angularjs文档中。 部分匹配指令: 规范化过程如下: 从元素/属性的前面去除x-和data-。将:,-或_分隔的名称

  • 主要内容:@Controller 注解,@RequestMapping 注解,示例,支持 Ant 风格的路径从 Java 5 开始,Java 就增加了对注解(Annotation)的支持,它是代码中的一种特殊标记,可以在编译、加载和运行时被读取,执行相应的处理。通过注解,开发人员可以在不改变原有代码逻辑的情况下,在代码中嵌入补充信息。 Spring 从 2.5 版本开始提供了对注解技术的全面支持,以替换传统的 XML 配置,简化 Spring 的配置。作为 Spring 框架的一个子项目, Sp