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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello-java-maker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值