RestTemplate 中文乱码配置
来源:互联网 发布:mysql keepalived 编辑:程序博客网 时间:2024/05/17 22:06
restTemplate作为spring web client下的一个工具类 对http请求做了一层封装,用起来也更加简洁容易,但最近遇到一个问题就是在发送请求时由于请求中包含中文导致乱码,都变成???????一堆问号,网上很多解决方案,但很多都比较…..
先看说如何解决:
@Bean配置方法:
@Bean public RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getMessageConverters().set(1, new StringHttpMessageConverter(StandardCharsets.UTF_8)); return restTemplate; }
applicationContext.xml配置方法:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" default-autowire="byName" default-lazy-init="true"> <!--方式一、使用jdk的实现--> <bean id="ky.requestFactory" class="org.springframework.http.client.SimpleClientHttpRequestFactory"> <property name="readTimeout" value="10000"/> <property name="connectTimeout" value="5000"/> </bean> <bean id="simpleRestTemplate" class="org.springframework.web.client.RestTemplate"> <constructor-arg ref="ky.requestFactory"/> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> <bean class="org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter"/> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> </list> </property> </bean></beans>
然后在使用的地方自动注入就好啦~~
再看看为什么会乱码:
public RestTemplate() { this.messageConverters.add(new ByteArrayHttpMessageConverter()); this.messageConverters.add(new StringHttpMessageConverter()); this.messageConverters.add(new ResourceHttpMessageConverter()); this.messageConverters.add(new SourceHttpMessageConverter<Source>()); this.messageConverters.add(new AllEncompassingFormHttpMessageConverter()); if (romePresent) { this.messageConverters.add(new AtomFeedHttpMessageConverter()); this.messageConverters.add(new RssChannelHttpMessageConverter()); } if (jaxb2Present) { this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter()); } if (jackson2Present) { this.messageConverters.add(new MappingJackson2HttpMessageConverter()); } else if (jacksonPresent) { this.messageConverters.add(new MappingJacksonHttpMessageConverter()); } }
从RestTemplate 构造方法可以看出restTemplate默认的messageConverters有好几个,这次的主角是StringHttpMessageConverter:
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); private final Charset defaultCharset; private final List<Charset> availableCharsets; private boolean writeAcceptCharset = true; /** * A default constructor that uses {@code "ISO-8859-1"} as the default charset. * @see #StringHttpMessageConverter(Charset) */ public StringHttpMessageConverter() { this(DEFAULT_CHARSET); } /** * A constructor accepting a default charset to use if the requested content * type does not specify one. */ public StringHttpMessageConverter(Charset defaultCharset) { super(new MediaType("text", "plain", defaultCharset), MediaType.ALL); this.defaultCharset = defaultCharset; this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values()); } /** * Indicates whether the {@code Accept-Charset} should be written to any outgoing request. * <p>Default is {@code true}. */ public void setWriteAcceptCharset(boolean writeAcceptCharset) { this.writeAcceptCharset = writeAcceptCharset; } @Override public boolean supports(Class<?> clazz) { return String.class.equals(clazz); } @Override protected String readInternal(Class<? extends String> clazz, HttpInputMessage inputMessage) throws IOException { Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType()); return StreamUtils.copyToString(inputMessage.getBody(), charset); } @Override protected Long getContentLength(String s, MediaType contentType) { Charset charset = getContentTypeCharset(contentType); try { return (long) s.getBytes(charset.name()).length; } catch (UnsupportedEncodingException ex) { // should not occur throw new IllegalStateException(ex); } } @Override protected void writeInternal(String s, HttpOutputMessage outputMessage) throws IOException { if (this.writeAcceptCharset) { outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets()); } Charset charset = getContentTypeCharset(outputMessage.getHeaders().getContentType()); StreamUtils.copy(s, charset, outputMessage.getBody()); } /** * Return the list of supported {@link Charset}. * <p>By default, returns {@link Charset#availableCharsets()}. Can be overridden in subclasses. * @return the list of accepted charsets */ protected List<Charset> getAcceptedCharsets() { return this.availableCharsets; } private Charset getContentTypeCharset(MediaType contentType) { if (contentType != null && contentType.getCharSet() != null) { return contentType.getCharSet(); } else { return this.defaultCharset; } }}
可以看到StringHttpMessageConverter默认是ISO-8859-1编码(有空可以看下别的MessageConverter其实都是UTF-8的),所以就把它改了就好啦~
阅读全文
0 0
- RestTemplate 中文乱码配置
- Spring RestTemplate中文乱码原因
- Spring RestTemplate结果中文乱码解决方案
- RestTemplate发送中文参数乱码问题
- restTemplate使用及中文乱码问题
- SpringBoot中,RestTemplate中文乱码解决方案
- restTemplate公用魔板使用及中文乱码问题
- RestTemplate解决乱码问题
- 解决spring3.0.5使用RestTemplate发送post请求响应中文乱码问题
- Informix 配置中文乱码
- mysql中文乱码配置
- Spring restTemplate 超时配置
- spring restTemplate配置
- 配置简单RestTemplate
- 关于Spring RestTemplate乱码问题解决
- spring RestTemplate上传文件乱码
- 配置中文Tomcat乱码问题
- Tomcat配置消除中文乱码
- 42、和为S的两个数字
- 关于RecyclerView 25+的使用问题
- 关于x86中的CS 和 IP 寄存器
- android给View设置指定边框
- Java中的异常
- RestTemplate 中文乱码配置
- B
- Locality Sensitive Hashing(LSH)之随机投影法
- c 中强制转化详解
- Test
- TabLayout关联ViewPager后不显示文字
- progressbar
- JAVA 连接数据库
- JAVA CAS原理分析