You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置RestTemplate以使用toString()方法作为对象序列化器?

配置RestTemplate使用toString()作为对象序列化器

没问题!要让RestTemplate用对象的toString()方法来做序列化,替代默认的JSON/XML转换逻辑,核心思路是自定义一个消息转换器,然后把它注册到RestTemplate的转换器列表最前面(保证优先被使用)。下面是具体的实现步骤和代码示例:


1. 自定义HttpMessageConverter

我们需要创建一个继承自AbstractHttpMessageConverter的转换器,专门处理对象到字符串的转换,逻辑就是直接调用对象的toString()方法:

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

public class ToStringHttpMessageConverter extends AbstractHttpMessageConverter<Object> {

    public ToStringHttpMessageConverter() {
        // 设置转换器支持的媒体类型,这里默认用text/plain,也可以按需添加其他类型(比如application/json)
        super(MediaType.TEXT_PLAIN, MediaType.ALL);
    }

    @Override
    protected boolean supports(Class<?> clazz) {
        // 返回true表示支持所有对象类型;如果只想针对特定类生效,可修改为`YourTargetClass.class.isAssignableFrom(clazz)`
        return true;
    }

    @Override
    protected void writeInternal(Object object, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        // 核心逻辑:调用对象的toString()方法获取序列化内容
        String serializedContent = object.toString();
        
        // 设置响应头的字符编码,避免乱码
        HttpHeaders headers = outputMessage.getHeaders();
        headers.setContentType(new MediaType(MediaType.TEXT_PLAIN, StandardCharsets.UTF_8));
        
        // 将内容写入输出流
        try (OutputStream os = outputMessage.getBody()) {
            os.write(serializedContent.getBytes(StandardCharsets.UTF_8));
        }
    }
}

2. 配置RestTemplate并注册自定义转换器

在Spring环境中,通过@Configuration类创建RestTemplate实例,把自定义转换器放到转换器列表的最前端(RestTemplate会按顺序查找可用的转换器,靠前的会被优先使用):

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class RestTemplateConfig {

    @Bean
    public RestTemplate restTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        
        // 先保存原有的转换器列表,避免丢失默认的其他转换能力(比如解析响应的逻辑)
        List<?> defaultConverters = new ArrayList<>(restTemplate.getMessageConverters());
        
        // 清空原有列表,先添加自定义转换器,再把默认转换器加回去
        restTemplate.getMessageConverters().clear();
        restTemplate.getMessageConverters().add(new ToStringHttpMessageConverter());
        restTemplate.getMessageConverters().addAll(defaultConverters);
        
        return restTemplate;
    }
}

额外说明

  • 如果只需要对特定类型使用toString()序列化,可以修改supports()方法,比如只让User类生效:return User.class.isAssignableFrom(clazz),其他类型依然使用默认的序列化逻辑。
  • 如果你需要让这个转换器支持更多媒体类型(比如请求头指定application/json时也用toString),可以在自定义转换器的构造方法里添加对应的MediaType,比如super(MediaType.TEXT_PLAIN, MediaType.APPLICATION_JSON)。

内容的提问来源于stack exchange,提问作者Tooraj Jam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:53:33