用页面测试表单中的中文没有乱码,初步定位是RestTemplate的问题,通过调试发现,FormHttpMessageConverter实例时,添加了其支持的转换器,ByteArrayHttpMessageConverter和StringHttpMessageConverter。
ByteArrayHttpMessageConverter是用于出来文件的,StringHttpMessageConverter用于处理其他的表单。
public FormHttpMessageConverter() {
this.supportedMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
this.supportedMediaTypes.add(MediaType.MULTIPART_FORM_DATA);
this.partConverters.add(new ByteArrayHttpMessageConverter());
StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
stringHttpMessageConverter.setWriteAcceptCharset(false);
this.partConverters.add(stringHttpMessageConverter);
this.partConverters.add(new ResourceHttpMessageConverter());
}
再看下StringHttpMessageConverter的默认构造方法
public StringHttpMessageConverter() {
this(DEFAULT_CHARSET);
}
public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
StringHttpMessageConverter默认的编码是ISO-8859-1,而multipart/form-data是用utf-8编码的,导致RestTemplate发送的数据已经是乱码
只要修改StringHttpMessageConverter的编码就可以了
List<HttpMessageConverter<?>> cos=new ArrayList<>();
StringHttpMessageConverter stringHttpMessageConverter=new StringHttpMessageConverter(Charset.forName("utf-8"));
FormHttpMessageConverter formHttpMessageConverter=new FormHttpMessageConverter();
List<HttpMessageConverter<?>> cos2=new ArrayList<>();
cos2.add(stringHttpMessageConverter);
cos2.add(new ByteArrayHttpMessageConverter());
cos2.add(new ResourceHttpMessageConverter());
formHttpMessageConverter.setPartConverters(cos2);
cos.add(formHttpMessageConverter);
cos.add(stringHttpMessageConverter);
restTemplate.setMessageConverters(cos);