63、SpringBoot---定制 RestTemplate--消息转化器、拦截器

★ 定制RestTemplate

复制代码
如要对RestTemplate进行自定义设置,Spring Boot也提供了两种主要方式:

▲ 局部式:在调用RestTemplateBuilder构建RestTemplate之前,先调用RestTemplateBuilder的方法对其定制,

   通过这种方式设置的RestTemplateBuilder仅对它构建的RestTemplate起作用。

▲ 全局式:使用RestTemplateCustomizer进行定制,所有实现RestTemplateCustomizer接口
   的Bean会被自动应用到自动配置的RestTemplateBuilder中,这种定制方式对整个应用范围的RestTemplate都起作用。

之前这个就属于局部式定制:

★ 定制RestTemplate主要在如下两方面进行定制:

复制代码
▲ 添加或替换拦截器:既可通过 RestTemplateBuilder 的 additionalInterceptors() 或 interceptors() 方法分别添加或替换拦截器。
   也可直接调用RestTemplate的方法来添加或替换。

▲ 添加或替换消息转换器:既可通过 RestTemplateBuilder 的 additionalMessageConverters() 或   messageConverters() 方法分别添加或替换拦截器。
   也可直接调用RestTemplate的方法来添加或替换。

全局式定制RestTemplate的代码演示

延用--SpringBoot 使用RestTemplate 整合第三方 RESTful 服务--的代码

全局式定制RestTemplate,创建一个 ClientCustomizer 类,实现 RestTemplateCustomizer 接口

测试:

可以看出 定制的 RestTemplate 的拦截器生效,开始执行。

java 复制代码
package cn.ljh.app.controller;


import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.client.RestTemplateCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;

import java.util.List;

//定制 RestTemplate

@Slf4j
@Configuration
public class ClientCustomizer implements RestTemplateCustomizer
{

    @Override
    public void customize(RestTemplate restTemplate)
    {
        //在此处即可对容器中自动构建的所有 RestTemplate 进行全局配置
        //添加HttpMessageConverters消息转换器,先get获取到所有消息转换,然后再用 add 进行添加
        FastJsonHttpMessageConverter messageConverter = new FastJsonHttpMessageConverter();
        //该设置说明FastJsonHttpMessageConverter只处理Json格式的数据
        messageConverter.setSupportedMediaTypes(List.of(MediaType.APPLICATION_JSON));
        //这样就添加了自定义的定制的消息转换器-----对象和json之间的转换
        restTemplate.getMessageConverters().add(messageConverter);

        //替换原有的拦截器
        //restTemplate.setInterceptors(List.of());
        //在原有的拦截器的基础上再添加自己的拦截器
        //此处可以用 Lambda 表达式来创建拦截器
        restTemplate.getInterceptors().add((request, body, execution) ->
        {
            //在这里面自定义拦截器规则
            log.debug("RestTemplate 的拦截器开始执行");
            String url = request.getURI().getPath();
            //设置token半小时内有效
            int time = (int) (System.currentTimeMillis() / 1000 + 1800);
            //获取请求方法名
            String methodName = request.getMethod().name();
            //获取请求体数据
            String strBody = new String(body);
            //此处调用服务器的方法来生成token,生成的token需要哪些参数,取决于服务器
            String token = generateToken(url, time, methodName, strBody);
            //设置一个额外的请求头(常常需要再授权时要设置额外的请求头)
            //具体要添加什么请求头,取决于业务的需要。
            request.getHeaders().add("X-cn-ljh", token);
            //继续向下执行
            return execution.execute(request, body);
        });
    }
    //模拟生成token
    private String generateToken(String url, int time, String method, String strBody)
    {
        return "mycustomtoken";
    }
}

pom.xml

需要这个fastjson 依赖,用于添加HttpMessageConverters消息转换器

相关推荐
落羽的落羽几秒前
【Linux系统】中断机制、用户态与内核态、虚拟地址与页表的本质
java·linux·服务器·c++·人工智能·算法·机器学习
拄杖忙学轻声码1 分钟前
maven引入本地jar包示例(非仓库引入)
java·maven·jar
lierenvip3 分钟前
Spring Boot 自动配置
java·spring boot·后端
tgethe2 小时前
java并发——1
java·开发语言·面试
coder_zh_2 小时前
Java基础-学习-面试-校招-要点突击检查
java
郑州光合科技余经理2 小时前
海外O2O系统源码剖析:多语言、多货币架构设计与二次开发实践
java·开发语言·前端·小程序·系统架构·uni-app·php
工程师老罗8 小时前
Image(图像)的用法
java·前端·javascript
leo_messi948 小时前
2026版商城项目(一)
java·elasticsearch·k8s·springcloud
美味蛋炒饭.9 小时前
Tomcat 超详细入门教程(安装 + 目录 + 配置 + 部署 + 排错)
java·tomcat