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消息转换器

相关推荐
葫芦和十三5 分钟前
图解 MongoDB 29|分片键陷阱:jumbo chunk、孤儿文档和写入热点
后端·mongodb·agent
进击的程序猿~20 分钟前
Go Zero源码阅读1
后端·golang
2601_961593422 小时前
Rust 开发环境配置繁琐?RustRover 开箱即用搞定编码调试
开发语言·后端·macos·rust
HZZD_HZZD2 小时前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
犀利豆4 小时前
AI in Harness(三)
人工智能·后端
IT_陈寒4 小时前
Java的Stream.parallel()把我CPU跑爆了,这种优化要谨慎
前端·人工智能·后端
山登绝顶我为峰 3(^v^)35 小时前
C/C++ 交叉编译方法
java·c语言·c++
一叶飘零_sweeeet5 小时前
Codex 与 Claude Code 深度拆解:两代 AI 编程智能体的技术本质与 Java 实战指南
java·ai·codex·claude code
子兮曰5 小时前
Bun 重写为 Rust:11天、64个Claude、16.5万美元,一次改变行业认知的激进实验
前端·后端·bun