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

版权声明:本文为本人辛苦原创文章,如果需要转载,请注明出处,谢谢!!! https://blog.csdn.net/sihai12345/article/details/80613971

找到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格式的数据来解决就行,这也正好符合前后端分离的效果

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页