详解Spring自定义消息格式转换器及底层源码分析

文章讲述了如何在SpringBoot2.5.12项目中创建一个自定义的HttpMessageConverter,用于解析和构建`Users`对象的请求参数,以及如何在WebConfig中配置和利用这个转换器进行数据交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:Springboot2.5.12


假设现在要实现这样的一个消息格式:

入参:

name:张三,age:20

图片

接口接收对象Users


  1. 自定义消息转换器

public class CustomHttpMessageConverter extends AbstractHttpMessageConverter<Object> {
  
  private static Logger logger = LoggerFactory.getLogger(CustomHttpMessageConverter.class) ;    // 这里指明了只要接收参数是Users类型的都能进行转换  @Override  protected boolean supports(Class<?> clazz) {
      return Users.class == clazz ;  }  // 读取内容进行内容的转换  @Override  protected Object readInternal(Class<? extends Object> clazz, HttpInputMessage inputMessage)      throws IOException, HttpMessageNotReadableException {
      String content = inToString(inputMessage.getBody()) ;    String[] keys = content.split(",") ;    Users instance = null ;    try {
        instance = (Users) clazz.newInstance();    } catch (Exception e1) {
        e1.printStackTrace() ;    }    for (String key : keys) {
        String[] vk = key.split(":") ;      try {
          Field[] fields = clazz.getDeclaredFields() ;        for (Field f:fields) {
            if (f.getName().equals(vk[0])) {
              f.setAccessible(true) ;            Class<?> type = f.getType() ;            if (String.class == type) {
                f.set(instance, vk[1]) ;            } else if (Integer.class == type) {
                f.set(instance, Integer.parseInt(vk[1])) ;            }            break ;          }        }      } catch (Exception e) {
          logger.error("错误:{}", e) ;      }    }    return instance ;  }
  // 如果将返回值以什么形式输出,这里就是调用了对象的toString方法。  @Override  protected void writeInternal(Object t, HttpOutputMessage outputMessage)      throws IOException, HttpMessageNotWritableException {
      outputMessage.getBody().write(t.toString().getBytes()) ;  }    @Override  protected boolean canWrite(MediaType mediaType) {
      if (mediaType == null || M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值