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 Netty
和Jetty RS
客户端。
spring-boot-starter-webflux
启动器默认依赖于io.projectreactor.netty:reactor-netty
,附带服务器和客户端的实现。如果选择使用Jetty作为反应式服务器,则应在Jetty反应式HTTP客户端库上添加依赖项org.eclipse.jetty:jetty-reactive-httpclient
。对服务器和客户端使用相同的技术具有其优势,因为它将自动在客户端和服务器之间共享HTTP资源。
开发人员可以通过提供一个自定义ReactorResourceFactory
或JettyResourceFactory
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
,它优先于所有其他会话相关的设置。