hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

Spring Boot WebFlux 2.1.7 中文翻译文档

2019-11-18杂谈搜奇网24°c
A+ A-

1. 媒介

从一最先进修 Netty 到 rxjava、Rector,再到 java8 的 CompletableFuture,就深深的为相应式编程入神,这类区分于传统的递次式编程,没准将来能在编程天下拓荒一片天地呢!

然后打仗到了 WebFlux 框架,也是充满了粘稠的兴致,想好好揣摩一番,怎样中文材料着实太少,就打起了英文文档的主张,惋惜英文程度着实捉急,老是看下一句,忘了上一句。诶,要不咱一句句翻译出来吧,如许读起来就通畅了,趁便能够造福下厥后进修者(想着翻译的东西要被人看,也是一份对峙的动力)。

翻译并没有逐字逐句去纠结,力图语义通畅,有明白毛病的处所,还贫苦人人指出,一同进修讨论。别的,文中还补充了一些本身演习的 demo。

原文链接:https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/htmlsingle/#boot-features-webflux

github 演习 demo:https://github.com/JMCuixy/webflux

tips:翻译是一项进步英语和进修妙技一石二鸟的事呀!

2. WebFlux 简介

Spring WebFlux 是 Spring 5.0 引入的新的相应式框架,区分于 Spring MVC,它不须要依靠Servlet API,它是完整异步非壅塞的,而且基于 Reactor 来完成相应式流范例。

Spring WebFlux 有两种表现形式:基于设置和基于解释。基于解释的完成体式格局非常类似于 SpringMVC 模子,如以下实例:

@RestController
@RequestMapping("/users")
public class MyRestController {

    @GetMapping("/\{user}")
    public Mono<User> getUser(@PathVariable Long user) {
        // ...
    }

    @GetMapping("/\{user}/customers")
    public Flux<Customer> getUserCustomers(@PathVariable Long user) {
        // ...
    }

    @DeleteMapping("/\{user}")
    public Mono<User> deleteUser(@PathVariable Long user) {
        // ...
    }

}

基于设置的完成体式格局,把路由和详细要求逻辑分脱离,如以下实例:

@Configuration
public class RoutingConfiguration {

    @Bean
    public RouterFunction<ServerResponse> monoRouterFunction(UserHandler userHandler) {
        return route(GET("/\{user}").and(accept(APPLICATION_JSON)), userHandler::getUser)
                .andRoute(GET("/\{user}/customers").and(accept(APPLICATION_JSON)), userHandler::getUserCustomers)
                .andRoute(DELETE("/\{user}").and(accept(APPLICATION_JSON)), userHandler::deleteUser);
    }

}

@Component
public class UserHandler {

    public Mono<ServerResponse> getUser(ServerRequest request) {
        // ...
    }

    public Mono<ServerResponse> getUserCustomers(ServerRequest request) {
        // ...
    }

    public Mono<ServerResponse> deleteUser(ServerRequest request) {
        // ...
    }
}

WebFlux 是 Spring 框架的一部分,其参考文档中供应了详细信息。

你能够定义恣意数目的 RouterFunction Bean,以对你的路由举行归结整顿。固然,你也能够针对多个 RouterFunction 设置优先级(@Order 注解)。

最先一个 WebFlux 项目,起首,须要将 spring-boot-starter-webflux 模块引入你的项目。值得注意的是,假如你同时引入了 spring-boot-starter-web 和 spring-boot-starter-webflux 模块会致使 Spring Boot 自动设置Spring MVC,而不是 WebFlux。由于很多 Spring 开发人员引入 spring-boot-starter-webflux ,仅仅是为了运用它的相应式编程(这个来由也是绝了),固然你也能够强迫把你的项目设置成 WebFlux:

SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)

3. 自动设置

Spring Boot 为 Spring WebFlux 供应的自动设置基本能适用于大多数运用。

Spring Boot 的供应的自动设置重要做了以下两个事情:

  • 为 HttpMessageReader 和 HttpMessageWriter 实例设置 HTTP 编解码器
  • 支撑效劳静态资本映照,包含对 WebJars 资本的支撑

假如你想要坚持 Spring Boot WebFlux 的自动设置功用,而且想增添分外的 WebFlux 设置项,你能够自定义 @Configuration 设置类,但不要增添 @EnableWebFlux 注解。

假如你想要完整掌握 WebFlux,你能够定义@Configuration 设置类,而且增添 @EnableWebFlux. 注解。

4. HttpMessageReaders 和 HttpMessageWriters 的 HTTP 编解码器

Spring WebFlux 运用 HttpMessageReader 和 HttpMessageWriter 接口来转换 HTTP 要乞降相应,能够经由过程 CodecConfigurer 获得它们的默许设置:

public interface CodecConfigurer {
    ...

    List<HttpMessageReader<?>> getReaders();

    List<HttpMessageWriter<?>> getWriters();
    ...
}

Spring Boot 供应了 CodecCustomizer 接口,许可你进一步定制编解码器,经由过程其 customize() 要领能够获取到 CodecConfigurer 对象,从而能够注册新的编解码东西,或对现有的编解码东西举行替代等。如以下实例:

import org.springframework.boot.web.codec.CodecCustomizer;

@Configuration
public class MyConfiguration {

    @Bean
    public CodecCustomizer myCodecCustomizer() {
        return codecConfigurer -> {
            // ...
        }
    }

}

5. 静态资本

Spring Boot 默许从类途径的以下目次(/static、 /public 、/resources 、/META-INF/resources)加载静态资本,固然,你能够自定义设置类完成 WebFluxConfigurer 并重写 addResourceHandlers 要领来修正默许资本途径:

@Configuration
public class MyWebFluxConfigurer implements WebFluxConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // do more
    }
}

Spring Boot 默许将静态资本映照在 /** 的途径下,固然,你能够经由过程修正 spring.webflux.static-path-pattern 属性来调解默许映照,比方,将一切资本映照到 /resources/** 途径 ,能够经由过程以下体式格局完成:

spring.webflux.static-path-pattern=/resources/**

你也能够经由过程设置 spring.resources.static-locations 属性值来自定义资本目次,假如你如许做了,默许的迎接页面检测也将会切换到你设置的资本目次。因而,在你的资本目次中,只需有一个 index.html 页面,都将会成为你的运用主页。

除了前面引见的规范静态资本外,另有一种特别的状况,那就是 webjars 内容。假如静态资本被打包成了 webjars 的花样,那末接见这些资本的途径就变成了 /webjars/** 。

tips:Spring WebFlux 运用程序不严厉依靠 Servlet API,因而不能将它们布置为 war 文件,也不运用 src/main/webapp 目次。

6. 模板引擎

Spring WebFlux 除了供应 REST web 效劳外,还支撑衬着动态 HTML 内容,Spring WebFlux 支撑一系列模板引擎,包含 Thymeleaf、FreeMarker 和 Mustache。

Spring Boot 为以下的模板引擎供应了自动设置的支撑:

  • FreeMarker
  • Thymeleaf
  • Mustache

当你运用了个中某个模板引擎,并挑选了 Spring Boot 自动设置,你须要将你的模板文件放在 src/main/resources/templates 目次下,以便被 Spring Boot 发明。

7. 非常处置惩罚

Spring Boot 供应了一个 WebExceptionHandler 用来处置惩罚一切毛病,WebExceptionHandler 实行一般被认为是处置惩罚链中的末了一步,仅位于 WebFlux 供应效劳之前。关于机械端,它一般是一个 JSON 相应,包含了HTTP 状况码、毛病信息等;关于浏览器端,它一般是一个 “whitelabel” HTML 毛病页面,页面衬着了雷同的毛病信息。固然,你也能够供应自定义的 HTML 模板来展现毛病信息(下文会说到)。

起首,定制此功用一般触及应用现有机制,但要替代或增添毛病内容,你能够增添 ErrorAttributes 范例的 Bean。

若要变动毛病处置惩罚行动,能够完成 ErrorWebExceptionHandler 并注册该范例的 bean 定义,然则 WebExceptionHandler 级别很低。因而 Spring Boot 还供应了一种轻易的体式格局,即继续 AbstractErrorWebExceptionHandler,让你能够经由过程 WebFlux 的体式格局处置惩罚毛病,如以下示例所示(这个设置贼庞杂,发起照样乖乖的用默许设置吧):

public class CustomErrorWebExceptionHandler extends AbstractErrorWebExceptionHandler {

    // Define constructor here

    @Override
    protected RouterFunction<ServerResponse> getRoutingFunction(ErrorAttributes errorAttributes) {

        return RouterFunctions
                .route(aPredicate, aHandler)
                .andRoute(anotherPredicate, anotherHandler);
    }

}

假如你想要为给定的毛病码展现自定义的 HTML 毛病页面,你能够在 /error 目次下增添一个毛病页面文件。能够是静态HTML(即增添到恣意静态资本文件夹下),也能够运用模板构建,文件名应为确实的状况码或系列掩码。

比方,要映照 404 毛病码到静态 HTML 文件,您的文件夹构造以下:

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- public/
             +- error/
             |   +- 404.html
             +- <other public assets>

运用 Mustache 模板对 5xx 毛病码作映照,您的文件夹构造以下:

src/
 +- main/
     +- java/
     |   + <source code>
     +- resources/
         +- templates/
             +- error/
             |   +- 5xx.mustache
             +- <other templates>

8. 过滤器

Spring WebFlux 供应了一个 WebFilter 接口,用来对 HTTP 要求-相应路由举行过滤,在运用程序上下文中找到的 WebFilter bean 将自动用于过滤每一个路由!以下是一个简朴鉴权的过滤器 demo — 关于 没有 token 参数的要求返回 401 毛病:

@Component
public class CustomWebFilter implements WebFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> queryParams = request.getQueryParams();
        if (queryParams == null || StringUtils.isEmpty(queryParams.getFirst("token"))) {
            Map<String, String> resultMap = new HashMap<>();
            resultMap.put("code", "401");
            resultMap.put("msg", "不法要求");
            byte[] datas = new byte[0];
            try {
                datas = new ObjectMapper().writeValueAsBytes(resultMap);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
            ServerHttpResponse response = exchange.getResponse();
            DataBuffer buffer = response.bufferFactory().wrap(datas);
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
            return response.writeWith(Mono.just(buffer));
        }

        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            ServerHttpResponse response = exchange.getResponse();
            //Manipulate the response in some way
        }));
    }
}

能够经由过程完成 Ordered 接口或运用 @Order 解释来设置过滤器的实行递次(实行递次是从小到大实行,较高的值被解释为较低的优先级)。Spring Boot 的自动设置功用已为你供应了一些内置的过滤器,以下是它们的实行递次:

Web Filter Order
MetricsWebFilter Ordered.HIGHEST_PRECEDENCE + 1
WebFilterChainProxy (Spring Security) -100
HttpTraceWebFilter Ordered.LOWEST_PRECEDENCE - 10
  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
Spring Boot WebFlux 2.1.7 中文翻译文档

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282129.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>