开发者

Spring MVC response encoding issue

In last few hours I've read a lot concerning this topic, and so far nothing has worked. I'm trying to return response containing "odd" some characters. Here is example of that, quite simple :

@ResponseBody
    @RequestMapping(value="test")
    public String test(){
        String test = "čćžđš";
        System.out.println(test);
        logger.info(test);
        return test;
    }

This is my web.xml, beca开发者_JAVA技巧use I found some answers where CharacterEncodingFilter helped(not in my case though). I used POST method because I read this applies to POST.

Also found this answer(related). Didn't help as well.

When I debug it the correct value appears, but when I print it doesn't as it can be seen below:

Spring MVC response encoding issue

When I test it from jmeter, the response seems to be OK, Content-Type is text/html;charset=UTF-8

Here is a screenshot of that as well. http://i56.tinypic.com/14lt653.jpg

I think the right way is to return UTF-8, maybe I'm wrong.


Instead @ResponseBody use ResponseEntity.

@RequestMapping(value="test")
public ResponseEntity<String> test(){
    String test = "čćžđš";
    System.out.println(test);
    logger.info(test);
    HttpHeaders responseHeaders = new HttpHeaders();
    responseHeaders.add("Content-Type", "application/json; charset=UTF-8");
    return ResponseEntity<String>(test,responseHeaders, HttpStatus.OK);
}


After few days of this I just had "who's your daddy moment". It came from reading spring 3.0 reference, I had nothing else to try so why not go trough entire documentation.. and combination of @axtavt answer :

Who sets response content-type in Spring MVC (@ResponseBody)

Changed original solution :

public class EncodingPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String name)
            throws BeansException {
        if (bean instanceof AnnotationMethodHandlerAdapter) {
            HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
            for (HttpMessageConverter<?> conv: convs) {
                if (conv instanceof StringHttpMessageConverter) {
                    ((StringHttpMessageConverter) conv).setSupportedMediaTypes(
                        Arrays.asList(new MediaType("text", "html", 
                            Charset.forName("UTF-8"))));
                }
            }
        }
        return bean;
    }

To :

public class EncodingPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String name)
            throws BeansException {
        if (bean instanceof AnnotationMethodHandlerAdapter) {
            HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
            for (HttpMessageConverter<?> conv: convs) {
                if (conv instanceof StringHttpMessageConverter) {
                    ((StringHttpMessageConverter) conv).setSupportedMediaTypes(
                        Arrays.asList(new MediaType("text", "plain", 
                            Charset.forName("UTF-8"))));
                }
            }
        }
        return bean;
    }

Darn spring!!! but still I'll continue to use it.


My simple solution:

@RequestMapping(value="test")
public ModelAndView test(){
  String test = "čćžđš";
  ...
  ModelAndView mav = new ModelAndView("html_utf8");
  mav.addObject("responseBody", test);
}

and the view html_utf8.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>${responseBody}

No additional classes and configuration.
And You can also create another view (for example json_utf8) for other content type.


I can see two problems in the actual delivered response.

  • The response is clearly just text, but your response content-type header is saying it is HTML.

  • Judging from the content-length of the response, the content has not actually been encoded in UTF-8.


FWIW - the CharacterEncodingFilter won't help with your problem because it is dealing with the encoding of the request not the response.


I think that the problem is that you need to configure the message converter for the response body. However, it appears that your application already does something in this area, because the default behavior of the StringHttpMessageConverter is to use "text/plain" as its content type.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜