Spring--SpringMVC3.1的ResponseBody返回字串亂碼問題解決

百聯達發表於2013-08-08

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章