`

SpringMVC杂记(二) 使用@ResponseBody出现乱码解决方法

阅读更多
SpringMVC杂记(二) 使用@ResponseBody出现乱码解决方法

1) RequestMapping
@Controller
@RequestMapping(value = "/just")
public class TestController {

	@ResponseBody
	@RequestMapping(value = "/test", method = {RequestMethod.GET})
	public String test() {
		return "中文";
	}
}


2) 配置
<mvc:annotation-driven conversion-service="conversion-service" validator="validator">
	<mvc:message-converters register-defaults="false">
		<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
		<bean class="org.springframework.http.converter.FormHttpMessageConverter" />
		<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
		<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
		<bean class="org.springframework.http.converter.StringHttpMessageConverter" />
	</mvc:message-converters>
</mvc:annotation-driven>


3) 原因是org.springframework.http.converter.StringHttpMessageConverter类默认编码是IOS-8859-1
自己定义一个HttpMessageConverter<String>的实现类即可解决问题。
public class UTF8StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

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

	private final List<Charset> availableCharsets;

	private boolean writeAcceptCharset = true;

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

	public void setWriteAcceptCharset(boolean writeAcceptCharset) {
		this.writeAcceptCharset = writeAcceptCharset;
	}

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

	@Override
	protected String readInternal(@SuppressWarnings("rawtypes") 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) {
			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));
	}

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

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

<mvc:annotation-driven conversion-service="conversion-service" validator="validator">
	<mvc:message-converters register-defaults="false">
		<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
		<bean class="org.springframework.http.converter.FormHttpMessageConverter" />
		<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
		<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
		<bean class="my.pkg.UTF8StringHttpMessageConverter" />
	</mvc:message-converters>
</mvc:annotation-driven>


---------------------------------
2012-12-24 补充:
不用这么麻烦
<mvc:annotation-driven conversion-service="conversion-service" validator="validator">
		<mvc:message-converters>
			<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
			<bean class="org.springframework.http.converter.FormHttpMessageConverter" />
			<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
			<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
			<bean class="org.springframework.http.converter.StringHttpMessageConverter">
				<constructor-arg value="UTF-8" />
			</bean>
		</mvc:message-converters>
	</mvc:annotation-driven>
分享到:
评论
1 楼 larry100y 2015-01-15  
找到解决方法了,谢谢

相关推荐

    springMVC3使用@ResponseBody向浏览器返回 json,注意区分jar包前缀

    --处理 @ResponseBody 中文乱码问题 --&gt; &lt;bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"&gt; &lt;property name="messageConverters"&gt; &lt;list&gt; &lt;!-- Support...

    SpringMVC使用@ResponseBody.rar

    下面我们将深入探讨`@ResponseBody`的使用、工作原理以及相关的配置和最佳实践。 1. **基本使用** `@ResponseBody`可以放在方法上,表示该方法的返回值将不经过视图解析,而是直接写入HTTP响应体。例如,我们有一...

    彻底根治Spring @ResponseBody JavaScript HTML特殊字符

    在开发Web应用时,我们经常会遇到一个问题:当使用Spring MVC的`@ResponseBody`注解将后端处理结果直接转化为HTTP响应体时,如果这个结果中包含HTML特殊字符,如尖角号、引号、按位与符号等,浏览器可能会误解析,...

    SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)

    而 `getUser` 方法返回一个 `User` 对象,通过 `@ResponseBody` 将其转换为JSON并返回给客户端。 ### 4. 总结 `@RequestBody` 和 `@ResponseBody` 提供了强大的功能,使得Spring MVC能够轻松处理复杂的数据交换。...

    SpringMVC中解决@ResponseBody注解返回中文乱码问题

    本文将详细介绍如何解决SpringMVC中`@ResponseBody`注解返回中文乱码的问题。 首先,我们可以尝试使用`@RequestMapping`注解的`produces`属性来指定响应内容的MIME类型和字符集。例如: ```java @RequestMapping...

    Springmvc 4.x利用@ResponseBody返回Json数据的方法

    ### @ResponseBody注解使用方法 @ResponseBody注解可以作用于方法上,它会指示Spring MVC框架将该方法的返回值直接写入到HTTP响应体中。这意味着返回的对象不是被添加到模型中,也不是用来定位一个视图名称的,而是...

    SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(上)

    在实际开发中,`@RequestBody` 和 `@ResponseBody` 的组合使用使得Spring MVC能够轻松地处理RESTful API的请求和响应。它们简化了数据交换的过程,减少了手动序列化和反序列化的代码,提高了开发效率。通过理解这两...

    springmvc+国际化i18N+springmvc验证+jetbrick-template使用+@responsebody+谷歌guava

    springmvc+国际化i18N+springmvc验证+jetbrick-template使用+@responsebody+谷歌guava: 1)围绕springmvc做的国际化 2)围绕springmvc做的验证 3)使用的jetbrick-template模板引擎 ……

    springMvc注解之@ResponseBody和@RequestBody详解

    例如,在控制器中,我们可以使用@ResponseBody注解来将方法的返回值序列化为JSON格式。 ```java @RequestMapping("/testResponseBody") @ResponseBody public String testResponseBody() { return "Hello, World!";...

    Spring MVC – Easy REST-Based JSON Services with @ResponseBody

    标题中的“Spring MVC – Easy REST-Based JSON Services with @ResponseBody”是指使用Spring MVC框架构建基于REST的JSON服务,并通过使用`@ResponseBody`注解来简化这一过程。REST(Representational State ...

    SpringMVC使用JSON的Jackson的jar包

    SpringMVC通过`@ResponseBody`注解支持将方法返回的对象直接序列化为JSON,然后发送到客户端。要实现这一功能,需要依赖Jackson库,特别是Jackson的两个核心组件:`jackson-mapper-asl`和`jackson-core-asl`。 1. ...

    springMVC解决中文乱码

    解决 SpringMVC 中的中文乱码问题可以通过多种方法来实现,包括在 web.xml 文件中配置字符编码、使用注解配置字符编码、使用 CharacterEncodingFilter 或者自定义 Filter 等。这些方法都可以有效地解决中文乱码问题...

    SpringMVC解决乱码

    然而,在使用SpringMVC时,可能会遇到乱码问题,例如在使用@ResponseBody注解时返回的数据出现乱码。在本文中,我们将讨论解决SpringMVC乱码问题的两种方法。 方法一:配置AnnotationMethodHandlerAdapter 在...

    对json格式的数据进行封装和转化,@responsebody注解所需的jar包JSON.rar

    描述中提到的"springmvc进行Jason数据封装转化时可以即使用也是@responsebody",指的是在Spring MVC的控制器(Controller)中,我们可以使用`@ResponseBody`注解配合Jackson库,实现将Java对象直接转换为JSON格式的...

    @responsebody+jetbrick-template-2.x+log+validator + springMVC 验证 注解 所需jar包

    1)spring MVC 中@ResponseBody需要的所有JAR包 2)性能还不错的模板引擎jetbrick-template-2.x 2.x的所需的所有jar包 3)日志jar包:slf4j和logback 所有 4)阿里 druid 连接池jar包 5)mysql数据库链接驱动jar包 6...

    springMvc注解之 ResponseBody和 RequestBody.docx

    `@RequestBody`用于从请求体中读取JSON数据并映射到方法参数,而`@ResponseBody`则将方法的返回值转换为JSON并发送到客户端。它们极大地简化了JSON数据在前后端之间的传递,减少了手动序列化和反序列化的代码,提高...

    SpringMVC Tomcat控制台乱码问题解决方案

    解决SpringMVC提交表单时网页出现乱码情况有两种方法:一种是使用自定义过滤器,另一种是使用SpringMVC自带的过滤器。 方法一:使用自定义过滤器 首先,需要编写一个自定义的过滤器EncodingFilter,该过滤器将对...

    SPRINGMVC 406问题解决方案

    在 SPRINGMVC 中,406 错误可能是由于缺少Jackson依赖项、未启用注解标签、控制器方法未使用@ResponseBody 等原因引起的。 二、解决方案 1. 添加Jackson依赖项 为了解决 406 错误,可以在项目的 pom.xml 文件中...

    SpringMVC杂记(三) 向导型Controller的实现(基于SpringMVC 3.1.1)

    在本篇博文中,我们将深入探讨SpringMVC框架中的向导型Controller的实现,这是SpringMVC 3.1.1版本的一个重要特性。向导型Controller通常用于处理多步骤的用户交互流程,如购物车结账、用户注册等,它能够引导用户...

    快速解决SpringMVC @RequestBody 用map接收请求参数的问题

    快速解决SpringMVC @...使用 @RequestBody 注解可以快速解决 SpringMVC 中的请求参数接收问题,但是需要注意一些细节,如使用 @RequestParam 注解,使用 getParameterMap() 方法,使用 JSON.stringify() 方法等。

Global site tag (gtag.js) - Google Analytics