简体   繁体   中英

Spring Controller @ResponseBody text/xml response UTF-8 encoding issue

I have annotation based Spring Rest Service running on jetty web server(also tomcat).The controller code is :

@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;
    }

The problem is that the response xml returned by Controller contains some characters like ä ö ü (Umlaute). The response when rendered on browser gives the parsing error :

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

(a small triangle appear in place of ü)

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

I have tried a below solutions but issue is still there.

  1. Tried using filters referring to solution given on technowobble

  2. passed the charset to StringHttpMessageConverter property

    <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>
  3. Enabled the SetCharacterEncodingFilter in tomcat -web.xml

  4. Changed the code to return ResponseEntity instead of String and removed @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); }

The 4th solution works But this being existing code I can't change method signature as it might impact existing clients of this service. Any ideas/pointers to solve this ?

in your dispatcher servlet context xml, you have to add a propertie. eg

<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>

Finally the issue is resolved. Here is what I did. 1. Used StringHttpMessageConverter's constructer for setting charset as :

<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>

Also I removed the unnecessary spring3.0 and 3.1 jars from my project. These were not required but were lying there. (should have done earlier).

This solved the problem for me.

There is no such answer with what I've solved my encoding problem so I'll post it.

I've got Spring RestService running on Jetty. At response body part of data that was received from database had correct UTF-8 encoding, but data from .property file (with error and success messages) had incorrect encoding and was like äöü...

At first I checked encoding of .property file itself with File->Settings->Editor->Code Style-> File Encodings (in such way you could not only check but set encoding you need) - it was UTF-8.

Then I set response encoding @RequestMapping in my RestController:

@RequestMapping(value = "/category/{categoryId}", method = RequestMethod.DELETE, produces = { "application/json;**charset=UTF-8**" })

and set defaultCharset property for Jackson2:

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="supportedMediaTypes" value="application/json;" />
    <property name="prettyPrint" value="true" />
    <property name="defaultCharset" value="UTF-8"/>
</bean>

No result. But then I found that the problem could be solved by adding UTF-8 encoding to PropertyPlaceholderConfigurer who grabs data from my .property file:

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:app.properties</value>
            <value>classpath:database.properties</value>
            <value>classpath:ru.error.messages.properties</value>
            <value>classpath:ru.success.messages.properties</value>
        </list>
    </property>
    <property name="fileEncoding" value="UTF-8"/>
</bean>

... and the problem has gone )))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM