No HttpMessageConverter for xxx

使用 RestTemplate 发起请求时报错如下
在这里插入图片描述

解决方案:自定义一个转换器

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StreamUtils;
import java.io.IOException;
import java.nio.charset.Charset;

/**
 * JSON body请求转换器
 * 继承 AbstractHttpMessageConverter 并实现他的转换方法
 * @Description JSON body请求
 * @Author Mr.dan
 */
public class JSONObjectHttpMessageConverter extends AbstractHttpMessageConverter<JSONObject> {

    @Override
    protected boolean supports(Class<?> clazz) {
        return clazz == JSONObject.class;
    }
    
 /**
     * 输入
     * @param clazz
     * @param inputMessage
     * @return
     * @throws IOException
     * @throws HttpMessageNotReadableException
     */
    @Override
    protected JSONObject readInternal(Class<? extends JSONObject> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        String jsonStr = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
        return JSON.parseObject(jsonStr);
    }
 
     /**
     * 输出
     * @param j
     * @param outputMessage
     * @throws IOException
     * @throws HttpMessageNotWritableException
     */
    @Override
    protected void writeInternal(JSONObject j, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        StreamUtils.copy(j.toJSONString(), Charset.forName("UTF-8"), outputMessage.getBody());
    }
}

构建bean时设置转换器参数

   
    @Bean
    public RestTemplate httpTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        //设置30秒超时
        httpRequestFactory.setConnectionRequestTimeout(30000);
        httpRequestFactory.setConnectTimeout(30000);
        httpRequestFactory.setReadTimeout(30000);
        //设置转换器列表
        restTemplate.setMessageConverters(getConverts());
        return restTemplate;
    }

    private List<HttpMessageConverter<?>> getConverts() {
        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        // String转换器
        StringHttpMessageConverter stringConvert = new StringHttpMessageConverter();
        //JSON转换器
        JSONObjectHttpMessageConverter jsonObjectConverter = new JSONObjectHttpMessageConverter();
        List<MediaType> stringMediaTypes = new ArrayList<MediaType>() {{
            //添加响应数据格式,不匹配会报401
            add(MediaType.TEXT_PLAIN);
            add(MediaType.TEXT_HTML);
            add(MediaType.APPLICATION_JSON);
        }};
        stringConvert.setSupportedMediaTypes(stringMediaTypes);
        //这里把刚刚的转换器加进去
        messageConverters.add(jsonObjectConverter);
        messageConverters.add(stringConvert);
        // .... 当然还可以有其他类型转换器 都是同样的操作
        return messageConverters;
    }

自此问题解决 还有更简单方法的欢迎补充

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值