我有一个问题,当服务器响应时,我无法将json格式的数据转换为UTF-8。我在spring配置xml中设置了MediaType
,但它似乎不起作用。这是我的服务器端代码响应:
@RequestMapping(value = "/post", method = RequestMethod.POST)
public @ResponseBody String postData(@RequestBody ObjectNode request){
// do something with request
return response;
}
当服务器响应时,json格式的数据将包含值为unicode。在客户端配置中:
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<bean id="formConverter" class="org.springframework.http.converter.FormHttpMessageConverter" />
<bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter" />
<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
<property name="supportedMediaTypes">
<list>
<bean class="org.springframework.http.MediaType">
<constructor-arg value="application" />
<constructor-arg value="json" />
<constructor-arg value="#{T(java.nio.charset.Charset).forName('UTF-8')}"/>
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
这是我的客户端代码请求数据,我使用postForObject方法:
@Autowired
private RestTemplate restTemplate;
public ObjectNode postObjectNode(ObjectNode request){
ObjectNode node = restTemplate.postForObject("http://localhost:8080/server/post", request, ObjectNode.class);
return node;
}
因此,包含unicode的数据将转换为????
。它是由服务器引起还是由restTemplate客户端引起的。请帮我。提前谢谢......
答案 0 :(得分:3)
如果处理程序方法为String
返回@ResponseBody
类型,默认消息转换器为StringHttpMessageConverter
,您可以像这样配置转换器
<mvc:annotation-driven >
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
答案 1 :(得分:2)
显然这是一个肮脏的黑客,但春天强迫我这样做:) 它在我们的项目中工作正常。我们正在调用一个方法,在上下文初始化后反射性地更改StringHttpMessageConverter.DEFAULT_CHARSET。
在包中的某处创建一个类:
public class CharsetPostProcessor implements InitializingBean, ApplicationContextAware {
private ApplicationContext applicationContext;
static void setFinalStatic(Field field, Object newValue) throws Exception {
field.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, newValue);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
@Override
public void afterPropertiesSet() throws Exception {
Field charsetField = applicationContext.getBean("stringHttpMessageConverter").getClass().getField("DEFAULT_CHARSET");
Charset charset = Charset.forName("UTF-8");
setFinalStatic(charsetField, charset);
}
}
并在Spring上下文定义中添加以下内容:
<bean class="your.package.CharsetPostProcessor" />
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter" />
答案 2 :(得分:0)
在可能的情况下浏览器请求标题“Acept”是:text / html,application / xhtml + xml,application / xml; q = 0.9 /; q = 0.8。
因此额外的supportedMediaTypes解决了问题:
<mvc:annotation-driven >
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=UTF-8</value>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
注意,“text / *; charset = UTF-8”不起作用。