1、@RequestBody注解概述
定义与作用:@RequestBody
注解用于将HTTP请求体中的数据绑定到方法参数上,常用于处理JSON或XML格式的数据。
应用场景:适用于处理非默认的application/xwwwformurlencoded
,如application/json
或application/xml
。
2、配置HttpMessageConverter
必要性:为了让SpringMVC能够正确处理@RequestBody
注解的请求体数据,需要配置合适的HttpMessageConverter
。
配置示例:在Spring配置文件中添加MappingJackson2HttpMessageConverter
,支持JSON格式的转换。
<bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF8</value> <value>application/json;charset=UTF8</value> </list> </property> </bean>
3、服务接口示例
基本用法:通过@RequestBody
注解,可以将请求体中的JSON字符串绑定到相应的Java对象上。
@RestController public class ReqBodyController { @Data public static class Req { private String key; private Integer size; } @RequestMapping(value = "/body", method = RequestMethod.POST) public BaseRsp body(@RequestBody Req req) { return new BaseRsp<>(req); } }
4、前端调用示例
Ajax请求:使用$.ajax
方法发送POST请求,指定contenttype
为application/json
,并传递JSON格式的数据。
$.ajax({ url: "/login", type: "POST", data: JSON.stringify({userName: "admin", pwd: "admin123"}), contentType: "application/json; charset=utf8", success: function(data) { alert("request success !"); } });
控制器方法:在控制器中使用@RequestBody
注解接收JSON数据并绑定到Java对象。
@RequestMapping("/login") public void login(@RequestBody String userName, @RequestBody String pwd) { System.out.println(userName + ":" + pwd); }
5、注意事项
ContentType设置:必须显式指定请求头的ContentType
为application/json
,否则会导致解析错误。
请求方法限制:@RequestBody
不支持GET方法,通常用于POST、PUT等带有请求体的HTTP方法。
数据格式要求:请求体中的数据必须是有效的JSON格式,且键名必须与Java对象的属性名一致。
相关问题与解答
问题1:如何在SpringMVC中使用@RequestBody注解接收单个String类型的参数?
答:可以通过重写MappingJackson2HttpMessageConverter
类来处理单个String类型的参数,具体实现如下:
package com.test.converter.json; import org.springframework.http.HttpInputMessage; import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import java.io.IOException; import java.lang.reflect.Type; import java.util.LinkedHashMap; public class CustomerMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter { @Override protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException { Class<?> deseriClazz = getClazz(clazz); Object param = super.readInternal(deseriClazz, inputMessage); return getTrueObject(clazz, param); } }
然后在Spring配置文件中注册这个自定义的转换器:
<bean id="customMappingJacksonHttpMessageConverter" class="com.test.converter.json.CustomerMappingJackson2HttpMessageConverter"/>
问题2:为什么在使用@RequestBody注解时需要显式指定ContentType为application/json?
答:因为@RequestBody
注解默认处理的是application/json
或application/xml
等非默认的MIME类型,而浏览器默认使用的是application/xwwwformurlencoded
编码方式,如果不显式指定ContentType
为application/json
,SpringMVC无法正确解析请求体中的JSON数据,从而导致解析错误。
各位小伙伴们,我刚刚为大家分享了有关“springmvc @RequestBody String类型参数的使用”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!