ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Spring--SpringMVC3.1的ResponseBody返回字符串乱码问题解决

Spring--SpringMVC3.1的ResponseBody返回字符串乱码问题解决

原创 Linux操作系统 作者:百联达 时间:2013-08-08 16:37:50 0 删除 编辑

SpringMVC的@ResponseBody注解可以将请求方法返回的对象直接转换成JSON对象,但是当返回值是String的时候,中文会乱码。

 原因是因为其中字符串转换和对象转换用的是两个转换器,而String的转换器中固定了转换编码为"ISO-8859-1"


解决办法:


1.返回字符串时,将字符串结果转

return new String("你好".getBytes(), "ISO-8859-1"); 


2.添加@RequestMapping注解,配置produces的值


@RequestMapping(value = "/add", produces = {"application/json;charset=UTF-8"})


3.StringHttpMessageConverter重写


public class UTF8StringHttpMessageConverter extends
        AbstractHttpMessageConverter {

    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

    private final List availableCharsets;

    private boolean writeAcceptCharset = true;

    public UTF8StringHttpMessageConverter() {
        super(new MediaType("text", "plain", DEFAULT_CHARSET), MediaType.ALL);
        this.availableCharsets = new ArrayList(Charset
                .availableCharsets().values());
    }

    /**
     * Indicates whether the {@code Accept-Charset} should be written to any
     * outgoing request.
     *


     * Default is {@code true}.
     */
    public void setWriteAcceptCharset(boolean writeAcceptCharset) {
        this.writeAcceptCharset = writeAcceptCharset;
    }

    @Override
    public boolean supports(Class clazz) {
        return String.class.equals(clazz);
    }

    @Override
    protected String readInternal(Class clazz, HttpInputMessage inputMessage)
            throws IOException {
        Charset charset = getContentTypeCharset(inputMessage.getHeaders()
                .getContentType());
        return FileCopyUtils.copyToString(new InputStreamReader(inputMessage
                .getBody(), charset));
    }

    @Override
    protected Long getContentLength(String s, MediaType contentType) {
        Charset charset = getContentTypeCharset(contentType);
        try {
            return (long) s.getBytes(charset.name()).length;
        } catch (UnsupportedEncodingException ex) {
            // should not occur
            throw new InternalError(ex.getMessage());
        }
    }

    @Override
    protected void writeInternal(String s, HttpOutputMessage outputMessage)
            throws IOException {
        if (writeAcceptCharset) {
            outputMessage.getHeaders().setAcceptCharset(getAcceptedCharsets());
        }
        Charset charset = getContentTypeCharset(outputMessage.getHeaders()
                .getContentType());
        FileCopyUtils.copy(s, new OutputStreamWriter(outputMessage.getBody(),
                charset));
    }

    /**
     * Return the list of supported {@link Charset}.
     *
     *


     * By default, returns {@link Charset#availableCharsets()}. Can be
     * overridden in subclasses.
     *
     * @return the list of accepted charsets
     */
    protected List getAcceptedCharsets() {
        return this.availableCharsets;
    }

    private Charset getContentTypeCharset(MediaType contentType) {
        if (contentType != null && contentType.getCharSet() != null) {
            return contentType.getCharSet();
        } else {
            return DEFAULT_CHARSET;
        }
    }

}


配置文件:

   
       
           
       

   

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28624388/viewspace-768058/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
10年以上互联网经验,先后从事过制造业,证券业,物业行业和物流行业信息系统和互联网产品的研发,6年系统架构经验。最近关注Kubernetes微服务架构和Istio微服务治理框架。

注册时间:2013-02-05

  • 博文量
    317
  • 访问量
    1008976