FeignClient调用服务,传递的字符串参数中文数据变成???问题解决
FeignClient调用服务,传递的字符串参数中文数据变成???问题解决:
分析问题原因
前端调用接口,返回用户信息,中文信息全部返回了???,起初以为是接口字符串数据转换编码的问题,于是做了如下操作:
服务端增加 StringHttpMessageConverter配置,指定接口返回数据格式
@Configuration public class WebAppConfigurer implements WebMvcConfigurer { @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { StringHttpMessageConverter converter = new StringHttpMessageConverter(); List<MediaType> mediaTypes = new ArrayList<>(); mediaTypes.add(new MediaType("application","json",Charset.forName("UTF-8"));); converter.setSupportedMediaTypes(mediaTypes); converters.add(converter); } }
此方式配置完成后,仍然未解决问题,于是决定在方法上限制接口返回数据格式
方法上限制接口参数格式,接口方法上添加 produces={"application/json;charset=UTF-8"}
@PostMapping(value = "/test",produces={"application/json;charset=UTF-8"}) public ResultVo testMethod(@RequestBody String jsonData) {
return new ResultVo();
}
按照以上操作后,发现调用接口接收到中文字符串参数还是 ???
想到数据是通过FeignClient调用服务获取的,调试时发现调用方法时传递 json参数为中文,到了服务端接收到的参数,中文都变成了???,于是使用接口工具,直接调用此接口,传递了json参数,发现接收到的参数不是???了
于是分析,可能是FeignClient出现了问题,找到了相关资料,Feign调用接口时需要在FeignClient设置指定处理请求的提交内容类型:
在FeignClient调用的接口方法上,添加如下参数: produces=MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = "application/json;charset=UTF-8"
@FeignClient("user-service")
public interface UserService {
@PostMapping(value="/test",produces=MediaType.APPLICATION_JSON_UTF8_VALUE,consumes = "application/json;charset=UTF-8")
ResultVo testMethod(@RequestBody String jsonData);
}
修改后重新编译启动,测试通过, ???乱码问题解决.
相关参数说明:
1、consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
2、produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回