方法参数类型字符串所需的请求参数 'formulaId' 不存在 - Thymeleaf、SpringBoot

Required request parameter 'formulaId' for method parameter type String is not present - Thymeleaf, SpringBoot

我遇到了一个问题,我有一个表单可以保存对公式的所有更新。这加载正常,一切正常,但尝试删除 updateFormula 对象中的列表中的成分时除外。

当我传递我的两个@RequestParameters 以删除特定成分时,我收到错误:

Required request parameter 'formulaId' for method parameter type String is not present

这让我很困惑,因为 formulaId 参数是针对第一个 @GetMapping 方法 updateFormula 的,它检索可以更新的公式信息。我曾尝试将 formulaId 添加为模型对象,并将其传递给 deleteIngredientInFormula 方法,但这也不起作用。

@GetMapping 获取所有要显示的公式详细信息

 @GetMapping("/update-formula")
    public String updateFormula(@RequestParam("formulaId") String id, Model model) {
        //unwraps the optional formula object if present, then adds to the model.
        formulaService.getFormulaById(id).ifPresent(f -> model.addAttribute("updatedFormula",f));
        return "Update-Formula-Form";
    }

@GetMapping select 列表中要删除的特定成分

    @GetMapping("delete-ingredient")
    public String deleteIngredientInFormula(@RequestParam("ingredientId") String inId,
                                            @RequestParam("formId") String formId) {

        formulaService.deleteIngredientInFormula(formId, inId);
        return "redirect:/update-formula";
    }

Thymeleaf 页面:更新公式表单

<div class="container">
    <h2>Formula Update Form</h2>
    <form action="#" th:action="@{/save-updated-formula}" method="post" th:object="${updatedFormula}">

      <input type="text" th:readonly="true" th:field="*{formulaId}">
      <input type="text" th:field="*{formulaName}">
      <input type="text" th:field="*{dosageForm}">
      <input type="text" th:readonly="true" th:field="*{unitWeight}">
      <input type="text" th:field="*{servingSize}">

  <!--FORMULA INGREDIENTS (SELECT ACTION) -->
    <div class="container table-responsive">
      <table class="table table-striped">
        <thead class="table-light">
        <tr>
          <td>Ingredient ID</td>
          <td>Ingredient Name</td>
          <td>Type</td>
          <td>Potency</td>
          <td>Manufacturer</td>
          <td>Label Claim (mg)</td>
          <td>Delete Ingredient</td>
        </tr>
        </thead>
        <tbody>
        <tr th:each="ingredient, holder : *{ingredients}">
          <td><input th:readonly="true" th:field="*{ingredients[__${holder.index}__].ingredientId}"></td>
          <td><input th:readonly="true" th:field="*{ingredients[__${holder.index}__].ingredientName}"></td>
          <td><input th:readonly="true" th:field="*{ingredients[__${holder.index}__].type}"></td>
          <td><input th:field="*{ingredients[__${holder.index}__].potency}"></td>
          <td><input th:readonly="true" th:field="*{ingredients[__${holder.index}__].manufacturer}"></td>
          <td><input th:field="*{ingredients[__${holder.index}__].labelClaim}"></td>
          <td>
            <a th:href="@{/delete-ingredient(ingredientId=${ingredient.getIngredientId()}, formId=${updatedFormula.getFormulaId()})}"
               class="btn btn-info btn-sm">Delete</a>
          </td>
        </tr>
        </tbody>
      </table>
    </div>

      <button type="submit" class="btn btn-info col-2">Save Formula Details</button>
    </form>
</div>

当您调用 @GetMapping("delete-ingredient") 端点时,您将重定向到需要 formulaIdupdate-formula。这就是您收到错误的原因。您基本上是在没有任何其他数据的情况下重定向到 update-formula。您需要按如下方式添加:

@GetMapping("delete-ingredient")
public String deleteIngredientInFormula(@RequestParam("ingredientId") String inId,
                                        @RequestParam("formId") String formId) {
    formulaService.deleteIngredientInFormula(formId, inId);
    return "redirect:/update-formula?formulaId=" + formId;
}

此外,您可能希望对同一事物使用相同的参数名称。你有 @RequestParam("formulaId") String id@RequestParam("formId") String formId 如果我理解正确的话它们是一回事 formulaId.

最后,您绝对不应该使用 GET 来删除数据。这就是 DELETE HTTP 方法存在的原因。