springmvc @RequestBody String类型参数的使用

网友投稿 2677 2022-11-27

springmvc @RequestBody String类型参数的使用

springmvc @RequestBody String类型参数的使用

目录springmvc @RequestBody String类型参数springmvc用Map接收请求参数分析第一种情况,什么也不设置,无参数传递第二种情况,加个参数试试 => .../testmap?test1=2342第三种情况,给Map参数添加@RequestParam注解小结一下吧

springmvc @RequestBody String类型参数

通过如下配置:

class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

text/html;charset=UTF-8

application/json;charset=UTF-8

class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">

text/html;charset=UTF-8

application/json;charset=UTF-8

在spring mvc的Controller层使用@RequestBody接收Content-Type为application/json的数据时,默认支持Map方式和对象方式参数

@RequestMapping(value = "/[code]/saveUser", method = RequestMethod.POST)

@ResponseBody

public JsonResult saveUser(@PathVariable("code") Integer code, @RequestBody Map datas,@RequestBody User user) {

。。。

}

如果是一个参数时也需要用个Map或者对象处理,使用String会报解析错误,具体看:AbstractJackson2HttpMessageConverter的方法read(Type type, Class

@Override

public Object read(Type type, Class> contextClass, HttpInputMessage inputMessage)

throws IOException, HttpMessageNotReadableException {

javaType javaType = getJavaType(type, contextClass);

return readJavaType(javaType, inputMessage);

}

private Object readJavaType(JavaType javaType, HttpInputMessage inputMessage) {

try {

return this.objectMapper.readValue(inputMessage.getBody(), javaType);

}

catch (IOException ex) {

throw new HttpMessageNotReadableException("Could not read JSON: " + ex.getMessage(), ex);

}

}http://

为了让@RequestBody支持String参数(目前只支持接收单个参数)

重写org.springframework.http.converter.json.MappingJackson2HttpMessageConverter类

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;

/**

* 处理@RequestBody注解为String的情况,只支持接收单个参数的情况

* Created by test

* Date:2017/1/4

* Time:17:33

*/

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);

}

@Override

public Object read(Type type, Class> contextClass, HttpInputMessage inputMessage)

throws IOException, HttpMessahttp://geNotReadableException {

Type deseriType = getType(type);

Object param = super.read(deseriType, contextClass, inputMessage);

return getTrueObject(type, param);

}

/**

* 通过返回参数类型决定是否处理参数,如果是String类型的参数,将解析后的HashMap里的值返回(只支持单个参数)

*

* @param type 返回参数类型

* @param param 参数值

* @return 实际参数值

*/

private Object getTrueObject(Type type, Object param) {

if (type == String.class) {

Object backParam = null;

if (param != null && param instanceof LinkedHashMap) {

LinkedHashMap paramMap = (LinkedHashMap) param;

if (paramMap.size() == 1) {

backParam = paramMap.get(paramMap.keySet().iterator().next());

}

}

param = backParam;

}

return param;

}

/**

* 获取解析参数用的Type

*

* @param type 参数类型

* @return

*/

private Type getType(Type type) {

Type deseriClazz;

if (type == String.class) {

//jackson不支持String默认用LinkedHashMap

deseriClazz = LinkedHashMap.class;

} else {

deseriClazz = type;

}

return deseriClazz;

}

/**

* 获取解析参数用的Type

* @param clazz 参数类型

* @return

*/

private Class> getClazz(Class> clazz) {

Class> deseriClazz;

if (clazz == String.class) {

//jackson不支持String默认用LinkedHashMap

deseriClazz = LinkedHashMap.class;

} else {

deseriClazz = clazz;

}

return deseriClazz;

}

}

spring mvc xml配置文件修改:

class="com.test.converter.json.CustomerMappingJackson2HttpMessageConverter">

text/html;charset=UTF-8

application/json;charset=UTF-8

class="com.test.converter.json.CustomerMappingJackson2HttpMessageConverter">

text/html;charset=UTF-8

application/json;charset=UTF-8

Controller层:

@RequestMapping(value = "/delUser", method = RequestMethod.POST)

@ResponseBody

public JsonResult delUser(@RequestBody String id) {

。。。

}

springmvc用Map接收请求参数分析

第一种情况,什么也不设置,无参数传递

注解为 @Controller @RequestMapping

可以看到传递的为SpringMVC的BindingAwareModelMap类型,SpringMVC中的隐含模型就是这个类型,其作用域等价于 request 域,当添加Model、ModelMap参数时,SpringMVC实际传入的就是这个隐含模型;向这个隐含模型种设置值后,在返回的页面中就能通过request域取值。

第二种情况,加个参数试试 => .../testmap?test1=2342

结果类型还是一样,且参数不会被传入,当然使用request肯定能取出来。

第三种情况,给Map参数添加@RequestParam注解

1、Get请求 =>http://localhost:8080/ssm/v2/testmap?test1=234234

成功传入了参数,注意这个Map类型为LinkedHashMap,而不是隐含模型了

再添加个Model参数看看,隐含模型中依然没有值

所以添加@RequestParam注解后,SpringMVC会将 Get 请求中封装进对应的参数中,如果参数是Map就封装称LinkedHashMap而不再传入隐含模型

2、Post请求, 再测试测试Post请求bXzxsdL

与Get的结果一致:参数无@RequestParam注解时,Map接收隐含模型;添加@RequestParam注解时,Map接收LinkedHashMap;隐含模型中无值。

第四种情况,给Map参数添加@RequestBody注解,且请求方式为Post

出乎意料的也成功传入了,与@RequestParam注解结果类似,也是LinkedHashMap

复杂点的Json数据也能解析接收成功

小结一下吧

SpringMVC处理请求用Map类型接收参数时,如果参数无注解,则会传入BindingAwareModelMap类型,等价于Model、ModelMap参数;

参数添加@RequestParam注解时,会将参数包装称LinkedHashMap对象,参数的key为Map的key,参数值为Map的key,支持Get、Post方法(应该支持Put、Delete,没有测,俩方法与Post类似);

添加@RequestBody注解时,接收Json类型数据,也会包装成LinkedHashMap对象,该注解不支持Get请求,Get请求没有请求体不能传Json。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:maven编译正常,运行报错:中没有主清单属性
下一篇:Failed to load class
相关文章

 发表评论

暂时没有评论,来抢沙发吧~