`
kanpiaoxue
  • 浏览: 1781617 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

SpringMVC使用@ResponseBody输出字符串时遇到的乱码问题及解决办法

 
阅读更多

 

 

来源: http://tchen8.iteye.com/blog/993504

来源: http://forum.springsource.org/showthread.php?81858-ResponseBody-and-UTF-8

 

 

我的个人解决办法有2个:

1、在spring的MVC的范例里面找到了一个解决的方法,就是在使用 @ResponseBody 注释的方法的 @RequestMapping(value="/test/hello",produces="text/plain;charset=UTF-8") 里面添加 produces="text/plain;charset=UTF-8"

这样就可以输入你想要的编码格式了。不过,没有下面的第2种方法便捷。因为第1个解决方法中,在每次使用到非ISO-8859-1之外的字符编码的时候,都要填写 produces="text/plain;charset=UTF-8"。显得很笨拙,很罗嗦。请看下面的更彻底的解决方法。

2、在自己的src下面创建于spring同package [ org.springframework.http.converter ]的StringHttpMessageConverter 类,重写里面的编码:public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1"); 

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

 

就解决了该问题,也不用进行额外的spring的xml配置。

我修改后的代码如下:

 

/*
 * Copyright 2002-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.http.converter;

import java.io.IOException;
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.util.StreamUtils;

/**
 * Implementation of {@link HttpMessageConverter} that can read and write strings.
 *
 * <p>By default, this converter supports all media types ({@code &#42;&#47;&#42;}),
 * and writes with a {@code Content-Type} of {@code text/plain}. This can be overridden
 * by setting the {@link #setSupportedMediaTypes supportedMediaTypes} property.
 *
 * @author Arjen Poutsma
 * @since 3.0
 */
public class StringHttpMessageConverter extends AbstractHttpMessageConverter<String> {

	//public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");
	//overide here
	public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");

	private final Charset defaultCharset;

	private final List<Charset> availableCharsets;

	private boolean writeAcceptCharset = true;


	/**
	 * A default constructor that uses {@code "ISO-8859-1"} as the default charset.
	 * @see #StringHttpMessageConverter(Charset)
	 */
	public StringHttpMessageConverter() {
		this(DEFAULT_CHARSET);
	}

	/**
	 * A constructor accepting a default charset to use if the requested content
	 * type does not specify one.
	 */
	public StringHttpMessageConverter(Charset defaultCharset) {
		super(new MediaType("text", "plain", defaultCharset), MediaType.ALL);
		this.defaultCharset = defaultCharset;
		this.availableCharsets = new ArrayList<Charset>(Charset.availableCharsets().values());
	}

	/**
	 * Indicates whether the {@code Accept-Charset} should be written to any outgoing request.
	 * <p>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<? extends String> clazz, HttpInputMessage inputMessage) throws IOException {
		Charset charset = getContentTypeCharset(inputMessage.getHeaders().getContentType());
		return StreamUtils.copyToString(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 IllegalStateException(ex);
		}
	}

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

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

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

 

分享到:
评论

相关推荐

    SpringMVC使用@ResponseBody.rar

    当`@ResponseBody`方法抛出异常时,Spring MVC会自动捕获并处理这些异常。默认情况下,它会将异常信息转换为HTTP状态码和错误消息。可以通过配置`@ExceptionHandler`方法或全局异常处理器来自定义异常处理逻辑。 5...

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

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

    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注解返回中文乱码问题

    然而,当返回的字符串中包含中文字符时,如果没有正确设置编码,就可能导致乱码问题。本文将详细介绍如何解决SpringMVC中`@ResponseBody`注解返回中文乱码的问题。 首先,我们可以尝试使用`@RequestMapping`注解的`...

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

    在Spring MVC框架中,`@RequestBody` 和 `@ResponseBody` 是两个非常重要的注解,它们在处理HTTP请求和响应时起到了关键作用。本篇文章将详细解释这两个注解的工作原理、使用场景以及如何实现Java对象与XML/JSON数据...

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

    在Spring MVC 4.x版本中,开发者可以使用@ResponseBody注解来简化控制器层向客户端返回JSON格式数据的过程。 ### @ResponseBody注解使用方法 @ResponseBody注解可以作用于方法上,它会指示Spring MVC框架将该方法...

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

    例如,如果请求体是JSON格式,Spring会使用默认的`HttpMessageConverter`(如`MappingJackson2HttpMessageConverter`)将JSON字符串转换为Java对象。 ```java @PostMapping("/saveUser") public ResponseEntity ...

    springMVC解决中文乱码

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

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

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

    SpringMVC解决乱码

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

    springMvc注解之 ResponseBody和 RequestBody.docx

    在使用`@RequestBody`接收多层嵌套的JSON对象时,注意前端需要设置`contentType`为`"application/json"`,并且使用`JSON.stringify()`将数据转换为字符串。这是因为HTTP请求默认可能不包含正确的Content-Type头,...

    springMvc注解之@ResponseBody和@RequestBody详解

    Spring MVC注解之@ResponseBody和@RequestBody详解 在Spring MVC框架中,@ResponseBody和@RequestBody是两个非常重要的注解,它们分别用于处理HTTP请求响应体和请求体的序列化和反序列化。下面,我们将详细介绍这两...

    详解SpringMVC注解@initbinder解决类型转换问题

    在使用 SpringMVC 框架时,经常会遇到表单中的日期字符串和 JavaBean 的 Date 类型的转换问题。 SpringMVC 默认不支持这个格式的转换,因此需要手动配置,自定义数据的绑定才能解决这个问题。在需要日期转换的 ...

    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解决GET请求时中文乱码的问题.rar

    这个问题主要源于请求参数在URL中编码时使用的是UTF-8以外的字符集,导致服务器接收到的参数解码后出现乱码。本文将深入探讨这个问题,并提供解决方案。 一、问题解析 1. GET请求原理:GET请求的参数通常会附加在...

    SpringMVC使用JSON的Jackson的jar包

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

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

    在使用SpringMVC框架开发Web应用程序时,经常会遇到乱码问题,例如在Tomcat控制台中输出的中文字符变成乱码。这是因为Tomcat的控制台默认使用的字符编码是GBK,而SpringMVC框架使用的字符编码是UTF-8。因此,当我们...

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

    在 SpringMVC 中,使用 @RequestBody 注解可以将请求体中的数据转换为 Java 对象,但是在使用 map 接收请求参数时,经常会遇到一些问题。本文将讨论如何快速解决 SpringMVC @RequestBody 用map接收请求参数的问题。 ...

    对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...

Global site tag (gtag.js) - Google Analytics