【发布时间】:2016-09-22 14:46:05
【问题描述】:
我正在努力让我的 multipart/form-data 在 RestTemplate 实体中以 UTF-8 编码。我不知道我做错了什么。下面我发布了我的代码
LinkedMultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("text", text);
map.add("id", id);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.set("Content-Type","multipart/form-data;charset=UTF-8");
HttpEntity<LinkedMultiValueMap<String, String>> entity = new HttpEntity<>(map, httpHeaders);
ListenableFuture<ResponseEntity<String>> response = asyncRestOperations
.postForEntity(url, entity, String.class);
当我在文本参数中插入任何波兰字母时,例如:“ł” 其余模板将其作为“?”发送。您可以在下面看到它,实际上正文看起来像这样并且“ł”被转换为“?”:
Content-Disposition: form-data; name="text"
Content-Type: text/plain;charset=ISO-8859-1
Content-Length: 1
?
我不知道为什么它不能正常工作。如何将默认的 ISO-8859-1 编码更改为 UTF-8?非常感谢任何帮助!
干杯。
找到解决方案:
我稍微修改了我的 AsyncRestTemplate,它不再丢失 UTF-8 编码。我的工作代码:
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
List<HttpMessageConverter<?>> messageConverters = asyncRestTemplate.getMessageConverters();
StringHttpMessageConverter stringMessageConverter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
AllEncompassingFormHttpMessageConverter allEncompassingConverter = new AllEncompassingFormHttpMessageConverter();
allEncompassingConverter.setCharset(Charset.forName("UTF-8"));
allEncompassingConverter.setMultipartCharset(Charset.forName("UTF-8"));
allEncompassingConverter.setPartConverters(Collections.singletonList(stringMessageConverter));
for (Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator(); iterator.hasNext(); ) {
HttpMessageConverter conv = iterator.next();
if (conv instanceof AllEncompassingFormHttpMessageConverter) {
iterator.remove();
}
}
messageConverters.add(allEncompassingConverter);
asyncRestTemplate.setMessageConverters(messageConverters);
【问题讨论】:
-
我尝试将新的 StringHttpMessageConverter(Charset.forName("UTF-8")) 添加到 RestTemplate 但这没有效果。
-
我没有在它们上迭代删除/添加 messageConverters,而是扩展了默认
RestTemplate以使用字符集(在 FormHttp 和 StringHttp messageConverters 上)初始化此MyRestTemplate并将其用于执行doPost,只是为了为了清楚起见并将 REST 详细的内容保存在其他地方。以防万一有人发现有用...对于@dune76,仅添加新转换器似乎没有任何效果,因为处理似乎使用了第一个发现。此外,转换器列表的顺序很重要:如果您在最后添加并删除同一类的另一个,它将尝试使用其他转换器 O_O -
你会把解决方案作为答案并接受它:)
标签: spring utf-8 multipartform-data resttemplate multipartentity