1

我有一个问题,当服务器响应时,我无法将 json 格式的数据转换为 UTF-8。我已经MediaType在spring配置xml中设置了,但是好像不行。这是我的服务器端响应代码:

    @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客户端引起的。请帮我。提前致谢...

4

3 回答 3

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>
于 2013-08-15T02:23:26.497 回答
2

显然这是一个肮脏的 hack,但 Spring 强迫我这样做 :) 它在我们的项目中运行良好。我们正在调用一个在上下文初始化后反射地更改 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" />
于 2014-01-21T13:11:52.793 回答
0

在可能的情况下,浏览器请求标头“接受”为: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”不起作用。

于 2014-08-21T12:43:15.220 回答