SpringMVC控制器接收不了PUT提交的参数的解决方案

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> SpringMVC控制器接收不了PUT提交的参数的解决方案

找到web项目的 web.xml的文件的 ContextLoaderListener这个监听器,将这个改为下面的配置:


<!-- 解决PUT请求无法提交表单数据的问题 -->
<filter>
    <filter-name>HttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- 将POST请求转化为DELETE或者是PUT 要用_method指定真正的请求参数 -->
<filter>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>HiddenHttpMethodFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

如果以上方法会出现springmvc请求参数获取不到的话,请改为下面的方式:


<!-- 解决PUT请求无法提交表单数据的问题 -->
  <filter>
       <filter-name>HttpMethodFilter</filter-name>
       <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>HttpMethodFilter</filter-name>
       <url-pattern>/*</url-pattern>
   </filter-mapping>

   <!-- 将POST请求转化为DELETE或者是PUT 要用_method指定真正的请求参数 -->
   <filter>
       <filter-name>HiddenHttpMethodFilter</filter-name>
       <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>HiddenHttpMethodFilter</filter-name>
       <!--servlet为springMvc的servlet名 -->
       <servlet-name>SpringMVC</servlet-name>
   </filter-mapping>

现在再用put请求就没问题了。

如果以上的方法还是不能够解决你的问题的话,我还遇到过其他的解决方法。

1、当你的springmvc的controller方法是以下时

 /**
     * 修改用户
     * @param user
     * @return
     */
    @RequestMapping(value = "/user", method = RequestMethod.PUT)
    public ResponseEntity updateUserByUserId(User user){
        try {
            userService.updateUserById(user);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
        }
        return ResponseEntity.status(HttpStatus.OK).body(null);
    }

这里直接用 pojo,来接收前端发送过来的数据,但是这种方法我做项目的时候就是获取不了数据。然后,我就想着用 @RequestParam注解看能不能解决,于是,变成了下面的代码:

2、用 @RequestParam试试

 /**
     * 修改用户
     * @param user
     * @return
     */
    @RequestMapping(value = "/user", method = RequestMethod.PUT)
    public ResponseEntity updateUserByUserId(@RequestParam"user")User user){
        try {
            userService.updateUserById(user);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
        }
        return ResponseEntity.status(HttpStatus.OK).body(null);
    }

但是,很难受,还是不行,而且,这样还会报一个 user is not present 的错误。这个错误的意思是这个 user不存在

解决这个错误方法:

1、如果你获取到了前端的数据,那么很简单在 @RequestParam加上一个参数 required=false,这个值默认为 true,作用为:在传参数的时候,必须要有值,不然就报错。


@RequestParam(value= "user", required= false)User user

2、如果没有获取到前端的数据,那个悲剧了,我就找了好久解决。

解决方法:不用 @RequestParam,换成 @requestBody注解就解决了。

@requestBody:如果方法加上了@ResponseBody注解,Spring返回值到响应体。如果这样做的话,Spring将根据请求中的 Content-Type header(私下)使用 HTTP Message converters 来将domain对象转换为响应体。

也就是,在前端测试的时候,用 json格式的数据来解决就行,这也正好符合前后端分离的效果

原文地址:https://sihai.blog.csdn.net/article/details/80613971

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> SpringMVC控制器接收不了PUT提交的参数的解决方案


 上一篇
数据结构——线性表(java实现) 数据结构——线性表(java实现)
点个赞,看一看,好习惯!本文 GitHub 已收录,这是我花了 3 个月总结的一线大厂 Java 面试总结,本人已拿大厂 offer。 另外,原创文章首发在我的个人博客:,欢迎访问。 一、线性表一个线性表( Linear List
2021-04-04
下一篇 
ssm项目整合log4j日志 ssm项目整合log4j日志
在项目 classpath下创建一个 log4j.properties文件: ################################################################################
2021-04-04