我在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>
我尝试了以下解决方案,但问题仍然存在。
尝试使用过滤器参考technowobble
将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>
在tomcat -web.xml
SetCharacterEncodingFilter
将代码更改为返回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);
}
第4种解决方案有效但是这是现有代码,我无法更改方法签名,因为它可能会影响此服务的现有客户端。任何想法/指针来解决这个问题?
答案 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罐子。这些都不是必需的,而是躺在那里。 (应该早点完成)。
这解决了我的问题。