最近做项目的过程中,在与web端进行数据交互时遇到了两个问题,一是在ssm框架中使用@ResponseBody注解返回json数据时中文发生了乱码、二是用ajax请求后台数据时报415的错,在此总结记录一下。
1、解决使用@ResponseBody注解返回json数据时中文发生乱码问题
- 解决方法一:
在@RequestMapping注解中加上(produces = "application/json;charset=utf-8")
例如下面的代码片段:
这种解决方法需要在每个使用@ResponseBody注解返回json数据的方法上都加上图圈中的代码,比较麻烦,还有解决方法二
- 解决方法二:
在spring-mvc.xml中添加如下配置:
<!-- 处理请求返回json字符串的中文乱码问题 -->
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
附:
- @RequestMapping注解的produces属性是用于指定该方法的响应类型:
produces = "application/json":表示该方法将会返回json格式的数据
produces = "application/xml":表示该方法将会返回xml格式的数据
produces ="text/html":表示该方法将会返回string类型的数据
- @RequestMapping注解的consumes属性是用于指定该方法的请求类型:
consumes = "application/json" :表示服务器仅处理request Content-Type为“application/json”类型的请求
2、解决使用ajax请求后台数据报415问题
controller层的代码:
/**
* 新增用户
* @author LiJun
* @Date 2019/5/29
* @Time 14:19
* @param taUser
* @return java.lang.String
*/
@RequestMapping(value = "insert", method = {RequestMethod.POST}, produces = "application/json;charset=utf-8")
@ResponseBody
public JsonRespData insert(@RequestBody(required = false) TaUser taUser){
taUser.setSubmitTime(new Date());
taUser.setCreateTime(new Date());
log.info("入参参数:{}", JSON.toJSONString(taUser));
return taUserService.insertSelective(taUser);
}
ajax请求的代码:
var data = {
id : 1,
phone : "13000007777",
sid : 13
};
$.ajax({
url : "${path}/seller/insert",
type : "post",
data : JSON.stringify(data),
success : function (data) {
console.log(data);
}
});
然后会出现报错信息:
意思是服务器无法处理请求附带的媒体格式 (Unsupported Media Type)
出现415错误的原因总结:
1)原因可能是spring-mvc.xml中没有添加配置,注解;
2)pom.xml没有jackson包的引用;
3)Ajax请求时没有设置Content-Type为application/json;charset=utf-8;
4)发送请求内容没有发送json字符串,而是以json格式数据发送的
我这里是第三种情况引起的
解决方法:
1)检查springMVC配置文件中是否开启了注解:
2)maven引入jackson的包:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
3)设置ContentType为application/json;charset=utf-8:
4)将发送数据的格式弄成字符串:
附:
@RequestBody注解是后台用于接收前台传来的json格式的数据
但是,我们在传输json数据的时候,假如json数据为空,那么就会报一个错误,就是Required request body is missing;这个的意思就是我们这个接口必须要传输json格式的数据,假如没有数据,就会报错返回错误的信息
假如不想让系统报错,那么就需要在@RequestBody增加一个Required属性了,并且把该属性设置为false
参考: