springmvc responseBody返回中文乱码解决方案

方案一:一行代码搞定,缺点是每一个方法都需要写 啰嗦

@RequestMapping(value = "ajaxLogin" ,method=RequestMethod.POST,produces={"application/json;charset=UTF-8"})
@ResponseBody

方案二:自定义转码类

springmvc.xml配置文件

<mvc:annotation-driven> 
   <mvc:message-converters register-defaults="true"> 
       <bean class="com.test.framework.util.UTF8StringHttpMessageConverter"/> //红色部分修改成自己的包名称即可
   </mvc:message-converters> 
</mvc:annotation-driven> 

实现类:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;


import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.FileCopyUtils;


public class UTF8StringHttpMessageConverter extends AbstractHttpMessageConverter<String> { 
 
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); 
private final List<Charset> availableCharsets; 


public UTF8StringHttpMessageConverter() { 
this(DEFAULT_CHARSET); 



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



@Override 
protected boolean supports(Class<?> clazz) { 
return String.class.equals(clazz); 



@Override 
protected String readInternal(Class<? extends String> clazz, 
   HttpInputMessage inputMessage) throws IOException, 
   HttpMessageNotReadableException { 
MediaType contentType = inputMessage.getHeaders().getContentType(); 
Charset charset = contentType.getCharSet() != null ? contentType 
       .getCharSet() : DEFAULT_CHARSET; 
return FileCopyUtils.copyToString(new InputStreamReader(inputMessage 
       .getBody(), charset)); 



@Override 
protected void writeInternal(String t, HttpOutputMessage outputMessage) 
   throws IOException, HttpMessageNotWritableException { 
MediaType contentType = outputMessage.getHeaders().getContentType(); 
Charset charset = contentType.getCharSet() != null ? contentType 
       .getCharSet() : DEFAULT_CHARSET; 
FileCopyUtils.copy(t, new OutputStreamWriter(outputMessage.getBody(), 
       charset)); 



protected List<Charset> getAcceptedCharsets() { 
return this.availableCharsets; 



@Override 
protected Long getContentLength(String s, MediaType contentType) { 
if (contentType != null && contentType.getCharSet() != null) { 
   Charset charset = contentType.getCharSet(); 
   try { 
       return (long) s.getBytes(charset.name()).length; 
   } catch (UnsupportedEncodingException ex) {                 
       throw new InternalError(ex.getMessage()); 
   } 
} else { 
   return null; 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值