gpt4 book ai didi

springmvc @RequestBody String类型参数的使用

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 29 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章springmvc @RequestBody String类型参数的使用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

springmvc @RequestBody String类型参数

通过如下配置:

 <bean id="mappingJacksonHttpMessageConverter"        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">      <property name="supportedMediaTypes">          <list>              <value>text/html;charset=UTF-8</value>              <value>application/json;charset=UTF-8</value>          </list>      </property>  </bean>  <!-- 启动SpringMVC的注解功能,完成请求和注解POJO的映射 -->  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">      <property name="messageConverters">          <list>              <ref bean="mappingJacksonHttpMessageConverter"/>              <!-- JSON转换器 -->          </list>      </property>  </bean> 

在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<String, Object> 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);      }  }

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

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

package com.test.converter.jsonimport 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, HttpMessageNotReadableException {      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配置文件修改:

<bean id="mappingJacksonHttpMessageConverter"        class="com.test.converter.json.CustomerMappingJackson2HttpMessageConverter">      <property name="supportedMediaTypes">          <list>              <value>text/html;charset=UTF-8</value>              <value>application/json;charset=UTF-8</value>          </list>      </property>  </bean>

Controller层:

@RequestMapping(value = "/delUser", method = RequestMethod.POST)  @ResponseBody  public JsonResult delUser(@RequestBody String id) {  。。。  }

  。

springmvc用Map接收请求参数分析

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

注解为 @Controller @RequestMapping 。

springmvc @RequestBody String类型参数的使用

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

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

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

springmvc @RequestBody String类型参数的使用

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

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

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

springmvc @RequestBody String类型参数的使用

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

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

springmvc @RequestBody String类型参数的使用

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

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

springmvc @RequestBody String类型参数的使用

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

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

springmvc @RequestBody String类型参数的使用

springmvc @RequestBody String类型参数的使用

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

springmvc @RequestBody String类型参数的使用

springmvc @RequestBody String类型参数的使用

小结一下吧

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

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/yangxingzou/article/details/54092578 。

最后此篇关于springmvc @RequestBody String类型参数的使用的文章就讲到这里了,如果你想了解更多关于springmvc @RequestBody String类型参数的使用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com