我正在开发一个使用 Spring Boot 的汽车销售系统,当一个汽车经销商发布一辆汽车在销售时,汽车状态默认设置为PENDING,需要管理员批准发布,我想更新这个汽车状态,而不更新汽车的其他属性(里程、价格、型号、等等)。所以我试过使用put,但是我得到了一个错误,不允许POST。下面是我目前的代码。任何类似于mysql语句set columnName = newValue的见解,其中id =我的代码使用@PathVariable获取的id。
产品存储库(用于更新单个列)
@Modifying
@Query(value = "update Product p set p.status = :status where p.carId= :carId")
void setUpdateStatus (@Param("status") String status, @Param("carId") Long carId);
用于更新状态的产品服务方法。
public void updateStatus( Long carId){
productRepository.setUpdateStatus("APPROVED",carId);
}
使用@PathVariable从视图URL获取产品ID的控制器方法。
@PutMapping("/updateStatus/{carId}")
public void updateStatus(@PathVariable("carId") Long carId){
productService.updateStatus(carId);
}
这是我的thymeleaf视图部件,负责我从中获取id的url。
<form action="#" th:action="@{'/updateStatus/'+${pending.carId}}" th:method="put" >
<input type="hidden" name="_method" value="put" />
<button type="submit" id="Approve" name="Approve"> </button>
</form>
我期望的ID是用来更新状态为已批准。但我得到的错误方法POST不允许。正如你可以从上面看到我的方法=“放”不POST。我不知道出了什么问题。
2条答案
按热度按时间qni6mghb1#
可能spring security在你的项目中被激活了,默认情况下当你使用spring security时csrf保护是启用的,所以你需要在请求头中发送csrf参数或者去激活csrf。
在这里您可以看到如何发送标头参数:Spring MVC PUT Request returns 405 Method Not Allowed
下面介绍如何停用csrf:Enable HTTP Request POST in Spring Boot
**第二个选项仅用于开发!**停用crsf保护可能会使应用程序变得不安全。
jdgnovmf2#
问题可能是HTML表单本身不支持PUT方法,所以PUT请求作为POST请求发送,这就是为什么您会收到不允许POST方法的错误。
要解决这个问题,你可以在表单中添加一个隐藏的输入字段来覆盖PUT方法。下面是Thymeleaf视图的更新版本:
在这个更新的版本中,我们将表单的method属性设置为“post”,但是我们还包含了一个名为“_method”的隐藏输入字段,其值为“put”,这将覆盖POST方法,并告诉Spring将请求视为PUT请求。
通过此更改,控制器现在应该能够接收PUT请求并按预期更新汽车的状态。