Spring MVC 如何在Sping Boot 中更新单个表列而不更新其余属性?

dpiehjr4  于 2023-03-13  发布在  Spring
关注(0)|答案(2)|浏览(143)

我正在开发一个使用 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。我不知道出了什么问题。

qni6mghb

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保护可能会使应用程序变得不安全。

jdgnovmf

jdgnovmf2#

问题可能是HTML表单本身不支持PUT方法,所以PUT请求作为POST请求发送,这就是为什么您会收到不允许POST方法的错误。
要解决这个问题,你可以在表单中添加一个隐藏的输入字段来覆盖PUT方法。下面是Thymeleaf视图的更新版本:

<form th:action="@{'/updateStatus/'+${pending.carId}}" method="post">
    <input type="hidden" name="_method" value="put" />
    <button type="submit">Approve</button>
</form>

在这个更新的版本中,我们将表单的method属性设置为“post”,但是我们还包含了一个名为“_method”的隐藏输入字段,其值为“put”,这将覆盖POST方法,并告诉Spring将请求视为PUT请求。
通过此更改,控制器现在应该能够接收PUT请求并按预期更新汽车的状态。

相关问题