方法参数类型字符串所需的请求参数 '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")
端点时,您将重定向到需要 formulaId
的 update-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 方法存在的原因。
我遇到了一个问题,我有一个表单可以保存对公式的所有更新。这加载正常,一切正常,但尝试删除 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")
端点时,您将重定向到需要 formulaId
的 update-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 方法存在的原因。