zoukankan      html  css  js  c++  java
  • 20191127 Spring Boot官方文档学习(4.14-4.17)

    4.14。使用RestTemplate调用REST服务

    如果需要从应用程序调用远程REST服务,则可以使用Spring Framework的RestTemplate类。由于RestTemplate实例通常需要在使用前进行自定义,因此Spring Boot不提供任何单个自动配置的RestTemplate bean。但是,它会自动配置RestTemplateBuilder,可以在需要时创建RestTemplate实例。自动配置RestTemplateBuilder可确保明智地将HttpMessageConverters应用于RestTemplate实例。

    以下代码显示了一个典型示例:

    @Service
    public class MyService {
    
        private final RestTemplate restTemplate;
    
        public MyService(RestTemplateBuilder restTemplateBuilder) {
            this.restTemplate = restTemplateBuilder.build();
        }
    
        public Details someRestCall(String name) {
            return this.restTemplate.getForObject("/{name}/details", Details.class, name);
        }
    
    }
    

    RestTemplateBuilder包括许多有用的方法,可用于快速配置RestTemplate。例如,要添加BASIC身份验证支持,可以使用builder.basicAuthentication("user", "password").build()

    4.14.1。自定义RestTemplate

    有三种主要的自定义RestTemplate方法,具体取决于您希望自定义应用的范围。

    为了使所有定制的范围尽可能狭窄,请注入自动配置的RestTemplateBuilder对象,然后根据需要调用其方法。每个方法调用都返回一个新RestTemplateBuilder实例,因此自定义仅影响构建器的使用。

    要进行应用程序范围的附加自定义,请使用RestTemplateCustomizer Bean。所有此类bean都会自动向自动配置的RestTemplateBuilder中注册,并应用于自动生成的任何模板。

    以下示例显示了一个定制程序,该定制程序为除192.168.0.5以外的所有主机配置代理的使用:

    static class ProxyCustomizer implements RestTemplateCustomizer {
    
        @Override
        public void customize(RestTemplate restTemplate) {
            HttpHost proxy = new HttpHost("proxy.example.com");
            HttpClient httpClient = HttpClientBuilder.create().setRoutePlanner(new DefaultProxyRoutePlanner(proxy) {
    
                @Override
                public HttpHost determineProxy(HttpHost target, HttpRequest request, HttpContext context)
                        throws HttpException {
                    if (target.getHostName().equals("192.168.0.5")) {
                        return null;
                    }
                    return super.determineProxy(target, request, context);
                }
    
            }).build();
            restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient));
        }
    
    }
    

    最后,最极端(很少使用)的选项是创建自己的RestTemplateBuilder bean。这样做会关闭 RestTemplateBuilder 的自动配置,并防止使用任何RestTemplateCustomizer bean。

    4.15。使用WebClient调用REST服务

    如果您的类路径上具有Spring WebFlux,则还可以选择WebClient用于调用远程REST服务。与RestTemplate相比,此客户具有更实用的感觉并且完全响应式。您可以在Spring Framework文档WebClient的专用部分中了解有关的更多信息。

    Spring Boot 为您创建并预配置WebClient.Builder ;强烈建议将其注入您的组件中并使用它来创建WebClient实例。Spring Boot配置该构建器以共享HTTP资源,以与服务器相同的方式反映编解码器的设置(请参阅WebFlux HTTP编解码器自动配置),以及更多内容。

    以下代码显示了一个典型示例:

    @Service
    public class MyService {
    
        private final WebClient webClient;
    
        public MyService(WebClient.Builder webClientBuilder) {
            this.webClient = webClientBuilder.baseUrl("https://example.org").build();
        }
    
        public Mono<Details> someRestCall(String name) {
            return this.webClient.get().uri("/{name}/details", name)
                            .retrieve().bodyToMono(Details.class);
        }
    
    }
    

    4.15.1。WebClient运行时

    Spring Boot将根据应用程序类路径上可用的库自动检测ClientHttpConnector要使用哪个WebClient驱动器。目前,支持Reactor NettyJetty RS客户端。

    spring-boot-starter-webflux启动器默认依赖于io.projectreactor.netty:reactor-netty,附带服务器和客户端的实现。如果选择使用Jetty作为反应式服务器,则应在Jetty反应式HTTP客户端库上添加依赖项org.eclipse.jetty:jetty-reactive-httpclient。对服务器和客户端使用相同的技术具有其优势,因为它将自动在客户端和服务器之间共享HTTP资源。

    开发人员可以通过提供一个自定义ReactorResourceFactoryJettyResourceFactory bean 来覆盖Jetty和Reactor Netty的资源配置-这将同时应用于客户端和服务器。

    如果您希望为客户端覆盖该选择,则可以定义自己的ClientHttpConnector bean并完全控制客户端配置。

    您可以在Spring Framework参考文档中了解有关WebClient配置选项的更多信息

    4.15.2。WebClient定制

    有三种主要的WebClient自定义方法,具体取决于您希望自定义应用的范围。

    为了使所有定制的范围尽可能狭窄,请注入自动配置的WebClient.Builder对象,然后根据需要调用其方法。 WebClient.Builder实例是有状态的:构建器上的任何更改都会反映在随后使用它创建的所有客户端中。如果要使用同一构建器创建多个客户端,则也可以考虑使用WebClient.Builder other = builder.clone();克隆该构建器。

    要对所有WebClient.Builder实例进行应用程序级的额外自定义,您可以声明WebClientCustomizer bean并在注入点更改本地WebClient.Builder实例。

    最后,您可以使用原始API并使用WebClient.create()。在这种情况下,不会自动配置或应用WebClientCustomizer

    4.16。验证(Validation)

    只要JSR-303实现(例如Hibernate验证器)位于类路径上,就会自动启用Bean验证1.1 支持的方法验证功能。这样就可以在bean方法的参数或返回值上加javax.validation约束来注解它们。具有此类带注解方法的目标类需要在类型级别用@Validated注解进行注解,以便在其方法中搜索内联约束注解。

    例如,以下服务触发第一个参数的验证,确保其大小在8到10之间:

    @Service
    @Validated
    public class MyBean {
    
        public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code,
                Author author) {
            ...
        }
    
    }
    

    4.17。发送邮件

    Spring框架提供了一种使用JavaMailSender接口发送电子邮件的简单抽象方法,而Spring Boot为其提供了自动配置以及启动器模块。

    有关如何使用JavaMailSender的详细说明,请参见参考文档

    如果spring.mail.host和相关库(由spring-boot-starter-mail定义)可用,如果不存在则创建默认JavaMailSender。可以通过spring.mail名称空间中的配置项进一步自定义发送方。请参阅MailProperties以获取更多详细信息。

    特别是,某些默认超时值是无限的,您可能需要更改此值,以避免线程被无响应的邮件服务器阻塞,如以下示例所示:

    spring.mail.properties.mail.smtp.connectiontimeout=5000
    spring.mail.properties.mail.smtp.timeout=3000
    spring.mail.properties.mail.smtp.writetimeout=5000
    

    也可以使用Session中的JNDI配置JavaMailSender

    spring.mail.jndi-name=mail/Session
    

    当设置了jndi-name,它优先于所有其他会话相关的设置。

  • 相关阅读:
    Windows Azure Web Site (19) Azure Web App链接到VSTS
    Windows Azure Virtual Machine (35) Azure VM通过Linked DB,执行SQL Job
    Azure PowerShell (16) 并行开关机Azure ARM VM
    Windows Azure Virtual Network (12) 虚拟网络之间点对点连接VNet Peering
    Azure ARM (21) Azure订阅的两种管理模式
    Windows Azure Platform Introduction (14) 申请海外的Windows Azure账户
    Azure ARM (20) 将非托管磁盘虚拟机(Unmanage Disk),迁移成托管磁盘虚拟机(Manage Disk)
    Azure ARM (19) 将传统的ASM VM迁移到ARM VM (2)
    Azure ARM (18) 将传统的ASM VM迁移到ARM VM (1)
    Azure Automation (6) 执行Azure SQL Job
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/11941992.html
Copyright © 2011-2022 走看看