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