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,它优先于所有其他会话相关的设置。

20191127 Spring Boot官方文档学习(4.14-4.17)的更多相关文章

  1. 20191127 Spring Boot官方文档学习(9.1-9.3)

    9."使用方法"指南 9.1.Spring Boot应用程序 9.1.1.创建自己的FailureAnalyzer FailureAnalyzer被包装在FailureAnalys ...

  2. 20191127 Spring Boot官方文档学习(4.10)

    4.10.使用SQL数据库 从使用JdbcTemplate直接的JDBC访问到完整的"对象关系映射"技术(例如Hibernate),Spring框架为使用SQL数据库提供了广泛的支 ...

  3. 20191127 Spring Boot官方文档学习(4.11)

    4.11.使用NoSQL技术 Spring Data提供了其他项目来帮助您访问各种NoSQL技术,包括: Redis MongoDB Neo4J Solr Elasticsearch Cassandr ...

  4. 20191127 Spring Boot官方文档学习(4.12)

    4.12.缓存(Caching) Spring框架提供了对应用程序透明添加缓存的支持.从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数.缓存逻辑是透明应用的,不会对调用者造成任何 ...

  5. 20191127 Spring Boot官方文档学习(4.13)

    4.13.Messaging Spring框架为与消息传递系统集成提供了广泛的支持,从使用JmsTemplate简化JMS API到完整的异步接收消息的基础结构.Spring AMQP为高级消息队列协 ...

  6. 20191127 Spring Boot官方文档学习(4.18-4.24)

    4.18.JTA的分布式事务 通过使用Atomikos或Bitronix嵌入式事务管理器,Spring Boot支持跨多个XA资源的分布式JTA事务.部署到合适的Java EE应用程序服务器时,还支持 ...

  7. 20191127 Spring Boot官方文档学习(4.25)

    4.25. Testing Spring Boot提供了许多实用程序和注解,可以在测试应用程序时提供帮助.测试支持由两个模块提供:spring-boot-test包含核心项,spring-boot-t ...

  8. 20191127 Spring Boot官方文档学习(5)

    5.Spring Boot Actuator:可投入生产的功能 Spring Boot包含许多其他功能,可帮助您在将应用程序投入生产时监控和管理您的应用程序.您可以选择使用HTTP端点或JMX管理和监 ...

  9. 20191127 Spring Boot官方文档学习(6-8)

    6.部署Spring Boot应用程序 在部署应用程序时,Spring Boot的灵活打包选项提供了很多选择.您可以将Spring Boot应用程序部署到各种云平台,容器映像(例如Docker)或虚拟 ...

随机推荐

  1. python 多线程、线程锁、事件

    1. 多线程的基本使用 import threading import time def run(num): print('Num: %s'% num) time.sleep(3) if num == ...

  2. python实现学生信息系统

    要求:不能重名 ''' 一.需求:进入系统显示系统功能界面,功能如下: 1.添加学员 2.删除学员 3.修改学员信息 4.查询学员信息 5.显示所有学员信息 6.退出功能 ''' # 定义功能界面函数 ...

  3. web性能优化--算法优化(四)

    避免for-in 把数组长度保存在局部变量中 较少迭代次数(Duffs Device) 基于函数的循环比基于循环的迭代消耗性能更多 优化if-else,一般switch比if-else速度快(hash ...

  4. mac中登陆mysql忘记密码解决办法

    1.打开终端,输入命令:cd /usr/local/mysql/bin 2.mysql -uroot -p,用这条命令登陆时报错信息: 报错:Enter password: ERROR 1045 (2 ...

  5. mysql笔记——索引

    什么是索引? 数据库中的一个对象. 在数据库中用来加速表的查询. 通过使用快速路径访问方法定位数据,减少了磁盘的i/o. 与表分别独立存放,但不能独立存在,必须属于某个表. 由数据库自动维护,表被删除 ...

  6. 在Tomcat中部署Java Web应用程序几种方式

    在Tomcat中部署Java Web应用程序有两种方式:静态部署和动态部署.在下文中$CATALINA_HOME指的是Tomcat根目录. 一.静态部署      静态部署指的是我们在服务器启动之前部 ...

  7. c++常见函数记录

    1.bitsset 模板,可以操作二进制字符串,转化成数字等 2.swap()交换函数,将a,b的值交换 3.stringstream类用于字符串和其他类型的转换,操作方便 4.stx,tr1. 5. ...

  8. 【leetcode】1228.Missing Number In Arithmetic Progression

    题目如下: 解题思路:题目很简单.先对数组排序,根据最大值和最小值即可求出公差,然后遍历数组,计算相邻元素的差,如果差不等于公差,即表示数字缺失. 代码如下: class Solution(objec ...

  9. 两台linux服务器相互拷贝文件的两个方法

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...

  10. Mysql 日期函数date_format()

    用法:DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据 1.语法 date_fromat(date,format) 说明:date 参数是合法的日期.format 规定日期/时间的输 ...