Spring Controller @ResponseBody text / xml响应UTF-8编码问题

时间:2014-12-22 09:12:20

标签: spring utf-8 character-encoding response resttemplate

我在Jetty Web服务器(也是tomcat)上运行基于注释的Spring Rest Service。控制器代码是:

@RequestMapping(method = RequestMethod.POST, value = { "/ssrfeed/exec/",
                "/query/exec" }, consumes = { "application/xml", "text/xml",
                "application/x-www-form-urlencoded" }, produces = {
                "application/xml;charset=UTF-8", "text/xml;charset=UTF-8",
                "application/x-www-form-urlencoded;charset=UTF-8" })
        @ResponseBody
        protected String getXmlFeed(HttpServletRequest request,
                @PathVariable String serviceName, @RequestBody String xmlReq) {

                //code....
                return appXMLResponse;
    }

问题是Controller返回的响应xml包含一些字符,如äöü(Umlaute)。在浏览器上呈现时的响应会产生解析错误:

XML Parsing Error: not well-formed
Location: //localhost:8083/MySerice/ssrfeed/exec/
Line Number 18111, Column 17:
<FIRST_NAME>Tzee rfista</FIRST_NAME>
----------------^

(一个小三角形代替ü)

The expected is : <FIRST_NAME>Tzeeürfista</FIRST_NAME>

我尝试了以下解决方案,但问题仍然存在。

  1. 尝试使用过滤器参考technowobble

  2. 上给出的解决方案
  3. 将charset传递给StringHttpMessageConverter属性

    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
        <property name="messageConverters">
            <list>
                <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
                    <property name="supportedMediaTypes" value="application/json" />
                </bean>
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <property name="supportedMediaTypes" value="text/xml;charset=UTF-8" />
                </bean>
            </list>
        </property>
    </bean>
    
  4. 在tomcat -web.xml

  5. 中启用SetCharacterEncodingFilter
  6. 将代码更改为返回ResponseEntity而不是String并删除了@ResponseBody

      protected ResponseEntity<String> getXmlFeed(HttpServletRequest
    request, @PathVariable String serviceName, @RequestBody String xmlReq) {        
    //line of code
      HttpHeaders responseHeaders = new HttpHeaders();
      responseHeaders.add("Content-Type", "application/xml; charset=utf-8");
      return new ResponseEntity<String>(appXMLResponse, responseHeaders, HttpStatus.CREATED);
    
    }
    
  7. 第4种解决方案有效但是这是现有代码,我无法更改方法签名,因为它可能会影响此服务的现有客户端。任何想法/指针来解决这个问题?

2 个答案:

答案 0 :(得分:0)

在您的调度程序servlet上下文xml中,您必须添加一个属性。例如

<bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
    <array>
        <bean class = "org.springframework.http.converter.StringHttpMessageConverter">
            <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8" />
        </bean>
    </array>
</property>
</bean>

答案 1 :(得分:0)

最后问题得到了解决。这就是我做的。 1.使用StringHttpMessageConverter的构造函数将charset设置为:

<bean id="stringHttpMessageConverter"
            class="org.springframework.http.converter.StringHttpMessageConverter">
            <constructor-arg index="0" name="defaultCharset" value="UTF-8"/>
            <property name="supportedMediaTypes">
                <list>
                    <value>application/xml</value>
                    <value>text/xml</value>
                    <value>application/x-www-form-urlencoded</value>
                </list>
            </property>
        </bean>

我还从我的项目中删除了不必要的spring3.0和3.1罐子。这些都不是必需的,而是躺在那里。 (应该早点完成)。

这解决了我的问题。