HTTP 状态 405 - 不支持请求方法“POST”(Spring MVC)
Posted
技术标签:
【中文标题】HTTP 状态 405 - 不支持请求方法“POST”(Spring MVC)【英文标题】:HTTP Status 405 - Request method 'POST' not supported (Spring MVC) 【发布时间】:2012-06-24 03:26:56 【问题描述】:我收到此错误:HTTP Status 405 - Request method 'POST' not supported
我要做的是制作一个带有下拉框的表单,该下拉框根据在另一个下拉框中选择的其他值进行填充。例如,当我在 customerName
框中选择一个名称时,应该运行 .jsp 页面中的 onChange
函数,然后再次加载提交的页面,并使用 customerCountry
框中的相应值再次加载。
但是我收到了这个 HTTP 状态 405 错误。我在互联网上搜索了解决方案,但找不到任何有用的东西。这是我的代码的相关部分:
jsp页面的一部分
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style>
.error color: red;
</style>
<script>
function repopulate()
document.deliveryForm.submit();
function setFalse()
document.getElementById("hasId").value ="false";
document.deliveryForm.submit();
// document.submitForm.submit(); (This was causing the error)
</script>
</head>
<body>
<h1>Create New Delivery</h1>
<c:url var="saveUrl" value="/test/delivery/add" />
<form:form modelAttribute="deliveryDtoAttribute" method="POST" action="$saveUrl" name="deliveryForm">
<table>
<tr>
<td><form:hidden id="hasId" path="hasCustomerName" value="true"/></td>
</tr>
<tr>
<td>Customer Name</td>
<td><form:select path="customerName" onChange="repopulate()">
<form:option value="" label="--- Select ---" />
<form:options items="$customerNameList" />
</form:select>
</td>
<td><form:errors path="customerName" cssClass="error" /></td>
</tr>
<tr>
<td>Customer Country</td>
<td><form:select path="customerCountry">
<form:option value="" label="--- Select ---" />
<form:options items="$customerCountryList" />
</form:select>
</td>
<td><form:errors path="customerCountry" cssClass="error" /></td>
</tr>
</form:form>
<form:form name="submitForm">
<input type="button" value="Save" onClick="setFalse()"/>
</form:form>
</body>
</html>
控制器的一部分:
@RequestMapping(value = "/add", method = RequestMethod.GET)
public String getDelivery(ModelMap model)
DeliveryDto deliveryDto = new DeliveryDto();
model.addAttribute("deliveryDtoAttribute", deliveryDto);
model.addAttribute("customerNameList",
customerService.listAllCustomerNames());
model.addAttribute("customerCountryList", customerService
.listAllCustomerCountries(deliveryDto.getCustomerName()));
return "new-delivery";
// I want to enter this method if hasId=true which means that a value in the CustomerName
// drop down list was selected. This should set the CountryList to the corresponding values
// from the database. I want this post method to be triggered by the onChange in the jsp page
@RequestMapping(value = "/add", method = RequestMethod.POST, params="hasCustomerName=true")
public String postDelivery(
@ModelAttribute("deliveryDtoAttribute") DeliveryDto deliveryDto,
BindingResult result, ModelMap model)
model.addAttribute("deliveryDtoAttribute", deliveryDto);
model.addAttribute("customerNameList",
customerService.listAllCustomerNames());
model.addAttribute("customerCountryList", customerService
.listAllCustomerCountries(deliveryDto.getCustomerName()));
return "new-delivery";
// This next post method should only be entered if the save button is hit in the jsp page
@RequestMapping(value = "/add", method = RequestMethod.POST, params="hasCustomerName=false")
public String postDelivery2(
@ModelAttribute("deliveryDtoAttribute") @Valid DeliveryDto deliveryDto,
BindingResult result, ModelMap model)
if (result.hasErrors())
model.addAttribute("deliveryDtoAttribute", deliveryDto);
model.addAttribute("customerNameList",
customerService.listAllCustomerNames());
model.addAttribute("customerCountryList", customerService
.listAllCustomerCountries(deliveryDto.getCustomerName()));
return "new-delivery";
else
Delivery delivery = new Delivery();
//Setters to set delivery values
return "redirect:/mis/home";
我怎么会收到这个错误?任何帮助将非常感激!谢谢
编辑:将hasId
更改为hasCustomerName
。我仍然收到HTTP Status 405 - Request method 'POST' not supported
错误。
EDIT2:注释掉 setFalse
函数中导致错误的行
// D
【问题讨论】:
为什么要投反对票?请给我一个解释,以便我将来可以发布更好的问题。谢谢 对于遇到此问题并进入此页面的人,还要检查定义的操作是否命中现有端点,这是我的问题 :) 【参考方案1】:问题是您的控制器需要一个参数 hasId=false 或 hasId=true,但您没有传递它。您的隐藏字段的 ID 为 hasId,但作为 hasCustomerName 传递,因此没有映射匹配。
要么将隐藏字段的路径更改为 hasId,要么将映射参数更改为期望 hasCustomerName=true 或 hasCustomerName=false。 p>
【讨论】:
我看到我写这篇文章的时候有点累了。好眼力!我仍然得到完全相同的错误。任何想法它可能是什么? 错误信息怎么这么误导人?它使我们认为这是一个 HTTP 动词问题,而实际上它是一个参数问题。【参考方案2】:你可能需要换行
@RequestMapping(value = "/add", method = RequestMethod.GET)
到
@RequestMapping(value = "/add", method = RequestMethod.GET,RequestMethod.POST)
【讨论】:
不,有两种方法,每个RequestMethod一种。【参考方案3】:我发现了导致 HTTP 错误的问题。
在由“保存”按钮触发的setFalse()
函数中,我的代码试图提交包含该按钮的表单。
function setFalse()
document.getElementById("hasId").value ="false";
document.deliveryForm.submit();
document.submitForm.submit();
当我删除 document.submitForm.submit();
时,它可以工作:
function setFalse()
document.getElementById("hasId").value ="false";
document.deliveryForm.submit()
@Roger Lindsjö 感谢您发现我没有传递正确参数的错误!
【讨论】:
【参考方案4】:检查您返回的是@ResponseBody 还是@ResponseStatus
我遇到了类似的问题。我的控制器看起来像这样:
@RequestMapping(value="/user", method = RequestMethod.POST)
public String updateUser(@RequestBody User user)
return userService.updateUser(user).getId();
使用 POST 请求调用时,我总是收到以下错误:
HTTP 状态 405 - 不支持请求方法“POST”
过了一会儿,我发现该方法实际上被调用了,但是因为没有@ResponseBody 也没有@ResponseStatus Spring MVC 引发了错误。
要解决这个问题,只需添加一个@ResponseBody
@RequestMapping(value="/user", method = RequestMethod.POST)
public @ResponseBody String updateUser(@RequestBody User user)
return userService.updateUser(user).getId();
或您的方法的@ResponseStatus。
@RequestMapping(value="/user", method = RequestMethod.POST)
@ResponseStatus(value=HttpStatus.OK)
public String updateUser(@RequestBody User user)
return userService.updateUser(user).getId();
【讨论】:
【参考方案5】:我不确定这是否有帮助,但我遇到了同样的问题。
您正在使用带有 CSRF 保护的 springSecurityFilterChain。这意味着当您通过 POST 请求发送表单时,您必须发送一个令牌。尝试将下一个输入添加到您的表单中:
<input type="hidden" name="$_csrf.parameterName" value="$_csrf.token"/>
【讨论】:
如何临时禁用此过滤器链?因为有很多方法要改变,我希望它先行,然后逐步升级 @YuJiaao - 你可以在 Spring Security 参考中找到它,第 18.4.2 章 docs.spring.io/spring-security/site/docs/current/reference/html/…【参考方案6】:由于其他原因,我遇到了类似的问题(url 模式 test-response
未添加到 csrf 令牌中)
我通过在config/local.properties
中的以下属性中允许我的 URL 模式来解决它:
csrf.allowed.url.patterns = /[^/]+(/[^?])+(sop-response)$,/[^/]+(/[^?])+(merchant_callback)$,/[^/]+(/[^?])+(hop-response)$
修改为
csrf.allowed.url.patterns = /[^/]+(/[^?])+(sop-response)$,/[^/]+(/[^?])+(merchant_callback)$,/[^/]+(/[^?])+(hop-response)$,/[^/]+(/[^?])+(test-response)$
【讨论】:
以上是关于HTTP 状态 405 - 不支持请求方法“POST”(Spring MVC)的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC HTTP 状态 405 - 不支持请求方法“POST”
WebApi Post 方法总是返回“请求的资源不支持 http 方法 'GET'。”状态:405 方法不允许
更改 servlet 映射会引发“HTTP 状态 405 - 不支持请求方法 'GET'”
REST - HTTP 状态 405;方法不允许;请求方法“PUT”不支持错误
org.springframework.web.servlet.PageNotFound - 请求方法'POST'不支持http状态405