SpringBoot学习(八)RestTemplate/WebClient 调用REST服务、Validation校验和发邮件

一、RestTemplate调用Rest服务

如果需要从应用程序调用远程REST服务,可以使用Spring框架的RestTemplate类。由于在使用RestTemplate实例之前通常需要进行自定义,因此Spring Boot不提供任何单个自动配置的RestTemplate bean。但是,它会自动配置RestTemplateBuilder,可以在需要时使用它创建RestTemplate实例。自动配置的RestTemplateBuilder确保将敏感的httpmessageconverter应用于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。例如,要添加基本的验证支持,可以使用builder.basicAuthentication("user","password").build ()。

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。

二、WebClient调用REST服务

如果您的类路径上有Spring WebFlux,您也可以选择使用WebClient来调用远程REST服务。与RestTemplate相比,该客户机具有更强的功能性,并且是完全响应性的。您可以在Spring框架文档的专门部分了解更多关于WebClient的信息。

Spring Boot创建并预配置一个WebClient。为你建造者;强烈建议将其注入组件并使用它创建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);
    }

}

1.WebClient运行时

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

spring-boot-starter-webflux starter默认依赖于io.projectreator.netty:reator-netty,它同时提供了服务器和客户端实现。如果您选择使用Jetty作为响应性服务器,则应该在Jetty响应性HTTP客户端库org.eclipse.jetty:jetty-reactive-httpclient上添加一个依赖项。将相同的技术用于服务器和客户机具有优势,因为它将自动在客户机和服务器之间共享HTTP资源。

开发人员可以通过提供自定义的ReactorResourceFactory或JettyResourceFactory bean来覆盖Jetty和Reactor Netty的资源配置——这将应用于客户机和服务器。

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

您可以在Spring框架参考文档中了解更多关于WebClient配置选项的信息。

2.自定义WebClient

有三种主要的WebClient定制方法,这取决于您希望定制应用的范围。

要使任何自定义的范围尽可能窄,请注入自动配置的WebClient.Builder,然后根据需要调用它的方法。WebClient.Builder实例是有状态的:对生成器的任何更改都反映在随后使用它创建的所有客户机中。如果希望使用相同的生成器创建多个客户机,还可以考虑使用克隆生成器WebClient.Builder other = builder.clone();

要对所有WebClient.Builder实例进行应用程序范围的附加自定义,您可以声明WebClientCustomizer bean并在注入点局部更改WebClient.Builder。

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

三、Validation校验

只要类路径上有JSR-303实现(比如Hibernate验证器),Bean validation 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) {
        ...
    }

}

四、发送邮件

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

有关如何使用JavaMailSender的详细说明,请参阅参考文档。https://docs.spring.io/spring/docs/5.2.2.RELEASE/spring-framework-reference/integration.html#mail

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

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

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

也可以使用JNDI中的现有会话来配置JavaMailSender:

spring.mail.jndi-name=mail/Session

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

原文地址:https://www.cnblogs.com/muxi0407/p/12108796.html