如何使用json格式在restTemplate中将MediaType设置为UTF-8

时间:2013-08-14 16:14:13

标签: java rest tomcat spring-mvc

我有一个问题,当服务器响应时,我无法将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客户端引起的。请帮我。提前谢谢......

3 个答案:

答案 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”不起作用。