ada*_*shr 6 java rest put spring-mvc
我正在使用Spring MVC来公开一些RESTful Web服务.其中一个操作在提交表单时调用RESTful PUT操作.
但是,表单不是普通形式,因为它包含文件输入以及常规输入,如文本和复选框.
我已经配置春季REST风格的投入到工作中,并通过添加删除HiddenHttpMethodFilter
的web.xml
.在我的表单中,我也_method
发送了一个隐藏参数.
所有这一切都适用于DELETE,PUT没有文件上传等.当我尝试使用文件上传和表单数据进行PUT时,它给了我一个405
.
HTTP Status 405 - Request method 'POST' not supported
Run Code Online (Sandbox Code Playgroud)
我的控制器方法如下所示:
@RequestMapping(value = "/admin/cars/{carId}", method = PUT, headers = "content-type=multipart/form-data")
public String updateCar(@PathVariable("carId") String carId, CarForm form) {
// save and return the right view.
}
Run Code Online (Sandbox Code Playgroud)
我的HTML表单如下所示:
<form action="<c:url value='/admin/cars/${car.id}'/>" method="POST" enctype="multipart/form-data">
<input type="hidden" name="_method" value="PUT" />
<input type="text" name="carName" value="${car.name}" />
<input type="file" name="photo" />
<input type="submit" />
</form>
Run Code Online (Sandbox Code Playgroud)
我正在努力实现使用PUT的可行性吗?如果是这样,如何让Spring MVC明白这一点?
添加MultipartFilter
启用文件上传之前 HiddenHttpMethodFilter
在web.xml(写在HiddenHttpMethodFilter
API文档,见注释).
也:
注意:此过滤器是使用替代
DispatcherServlet
的MultipartResolver
支持,例如用于与不使用Spring的web MVC,自定义Web视图的Web应用程序或为Spring MVC的前应用自定义过滤器DispatcherServlet
(如HiddenHttpMethodFilter
).在任何情况下,此过滤器都不应与特定于servlet的多部分分辨率结合使用.
(来自MF的文档,强调我的)
此外,MultipartResolver
bean的名称必须是filterMultipartResolver
为了使MultipartFilter正常运行(或必须通过设置<init-param>
).
编辑:
正如我在上一篇评论中所预料的那样,有一个问题,(实际上,isMultipartContent中的方法以POST形式出现,即使它是PUT,因为在HiddenHttpMethodFilter之前声明了MultipartFilter. 如OP所述.)下面是extednded类,它最初使用的是slighlty修改的静态方法:CommonsMultipartResolver
默认情况下只支持POST方法.
public class PutAwareCommonsMultipartResolver extends CommonsMultipartResolver {
private static final String MULTIPART = "multipart/";
@Override
public boolean isMultipart(HttpServletRequest request) {
return request != null && isMultipartContent(request);
}
/**
* Utility method that determines whether the request contains multipart
* content.
*
* @param request The servlet request to be evaluated. Must be non-null.
*
* @return <code>true</code> if the request is multipart; {@code false}
* otherwise.
*
* @see ServletFileUpload#isMultipartContent(HttpServletRequest)
*/
public static final boolean isMultipartContent(HttpServletRequest request) {
final String method = request.getMethod().toLowerCase();
if (!method.equals("post") && !method.equals("put")) {
return false;
}
String contentType = request.getContentType();
if (contentType == null) {
return false;
}
if (contentType.toLowerCase().startsWith(MULTIPART)) {
return true;
}
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11022 次 |
最近记录: |