【问题标题】:Spring - Failed to read HTTP message. Required request body is missingSpring - 无法读取 HTTP 消息。缺少所需的请求正文
【发布时间】:2018-03-22 06:49:14
【问题描述】:

我正在尝试编辑考试对象,但出现此错误: 无法读取 HTTP 消息。缺少必需的请求正文。

我认为错误是您无法使用 HTTP GET 请求发送请求正文,但我不知道该怎么做。

用户选择要编辑的考试,我希望 HTML 将该考试 ID 传递给控制器​​。

我的控制器:

 @RequestMapping(value = "/editExam.html{examId}", method = { 
RequestMethod.GET, RequestMethod.PUT })
public String editExam(@ModelAttribute("exam") @PathVariable(value = 
"examId")Long examId, @RequestBody Exam exam,Model model, BindingResult 
result) {

         examRepository.findOne(examId);
            model.addAttribute("examTitle", exam.getExamTitle());
            model.addAttribute("examGradeWorth", exam.getExamGradeWorth());
            model.addAttribute("examGradeAchieved", exam.getExamGradeAchieved());


             exam.setExamTitle(exam.getExamTitle());
         exam.setExamGradeWorth(exam.getExamGradeWorth());
         exam.setExamGradeAchieved(exam.getExamGradeAchieved());

          examRepository.save(exam);

    return "editExam";
}

editExam.html:

  <form action="#" th:action="@{/editExam.html{examId}}"  th:object="${exam}" method="put">


    <table>
        <tr>
        <td> Exam Title:</td>
         <td><input type="text" th:field="*{examTitle}" th:text="${exam.examTitle}"/></td>
    <!--    <td th:if="${#fields.hasErrors('examTitlee')}" th:errors="*{examTitle}">error message</td>  --> 
        </tr>  
        <tr>
            <td> Exam grade worth </td>
            <td><input th:field="*{examGradeWorth}" /></td>
        <!--    <td th:if="${#fields.hasErrors('examGradeWorth')}" th:errors="*{examGradeWorth}">error message</td> -->
            </tr>  
            <tr>
                <td>examGradeAchieved</td>
                <td><input th:field="*{examGradeAchieved}"/></td>
                </tr>
            <tr>
                <td><button type="submit">Submit post</button></td>
                </tr>
    </table>

【问题讨论】:

  • 在您的 HTML 中,您没有在提交操作中指定 method 的类型。
  • &lt;form th:method="put"&gt;
  • @MehrajMalik 我确实做到了,但由于某种原因它没有显示,在那里进行了编辑。我认为错误可能是您无法使用 HTTP GET 请求发送请求正文,但我不知道应该如何完成。
  • 如果你想发送请求体,你应该使用 POST 而不是 GET
  • @cool 我试过了,它修复了错误,但是现在当我单击编辑考试时,它不再将我带到正确的 HTML 页面,它只是默认的 localhost 主页之一。和以前一样,它把我带到了正确的 html 页面。

标签: java spring http spring-boot thymeleaf


【解决方案1】:

根据设计/创建 REST API 的最佳实践,建议...

  • 当您在数据库中添加任何新资源时,请使用POST HTTP 方法
  • 更新现有资源时,使用PUT HTTP 方法
  • 在检索资源时,使用GET HTTP 方法
  • 删除任何资源时,使用DELETE HTTP 方法

因此,在您的情况下,您应该在更新资源时使用PUT HTTP 方法而不是GET,无论如何,GET HTTP 方法不允许用户添加请求-HTTP 请求中的正文。

【讨论】:

    【解决方案2】:

    我通过将控制器的开始更改为这样来修复错误:

    @RequestMapping(value = "/editExam.html/id={examId}", method = { RequestMethod.GET , RequestMethod.POST, RequestMethod.PUT})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-03
      • 2019-03-29
      • 1970-01-01
      • 2021-09-24
      • 2022-11-11
      • 2020-04-19
      • 1970-01-01
      • 2020-04-01
      相关资源
      最近更新 更多