Spring Boot Save将学生分配给组

时间:2018-12-09 11:45:35

标签: java spring spring-boot thymeleaf

我的Spring Boot简单应用程序有问题。我创建学生的日记。我具有将学生分配到小组的功能。我在百里香视图中创建,如下所示:

<form name="myForm" method="post">
  <div class="row" id="groupList">
    <div class="col-sm">
      <div class="form-group blu-margin" th:object="${group}">
        <select class="form-control" id="dropGroup">
          <option value="0">Wybierz grupę : </option>
          <option th:each="group : ${groupList}" th:value="${group.name}" th:text="${group.name}">
          </option>
        </select>
      </div>
    </div>
    <div class="col-sm">
      <div class="form-group blu-margin" th:object="${user}">
        <select class="form-control" id="dropGroup">
          <option value="0">Wybierz studenta : </option>
          <option th:each="user : ${userListNew}" th:value="${user.firstName}" th:text="${user.firstName}+ ' ' +${user.lastName}">
          </option>
        </select>
      </div>
    </div>
    <div class="col-sm">
      <td><input name="submit" type="submit" value="submit" /></td>
    </div>
  </div>
</form>

我的模型类用户和组:

组:

@OneToMany(mappedBy = "group")
private List<User> users;

用户:

@ManyToOne
private Group group;

这是我的控制器:

@RequestMapping(value = "/showGroupList", method = RequestMethod.GET)
public String showGroupList(Model model){
    List<Group> groupList = groupRepository.findAll();
    List<User> userList = userRepository.findAll();
    Role userRole = roleRepository.findByName("ROLE_USER");
    List<User> userListNew = new ArrayList<>();

    for (User user : userList){
        if (user.getRoles().contains(userRole)){
            userListNew.add(user);
        }
    }

    model.addAttribute("groupList", groupList);
    model.addAttribute("userListNew", userListNew);
    return "groupList";
}

现在,当我从他们的列表中选择组和用户并单击提交时,出现以下错误:

  

WARN 1132 --- [nio-8070-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver:已解决[org.springframework.web.HttpRequestMethodNotSupportedException:请求方法'POST'不支持”

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

这是您希望在表单中使用的方法的问题。您的错误是:

Request method 'POST' not supported

它清楚地表明您的应用程序不知道如何处理Post请求,因此您要求POST表单。在表单顶部,您要求POST http方法:

<form name="myForm" method="post">

但是,在控制器层中,您仅指定GET http方法:

method = RequestMethod.GET

您可以通过执行以下两个选项之一来解决此问题:将表单更改为Get,或在控制器中指定发送POST请求时的操作。查看您的应用程序,我想您想先调用GET来获取列表,然后在提交时进行POST-但这是您偏爱的设计问题。

为了添加POST控制器,也许像这样工作:

@RequestMapping(value = "/", method = RequestMethod.POST)
public ResponseEntity <String> persistGroup(@RequestBody Group group) {
    groupRepository.save(group);
    return ResponseEntity.status(HttpStatus.CREATED).build();
}

您将需要测试您的特定实现,以查看表单作为主体的形式(它可能不是Group),并查看去往哪个URI(“ /”可能不是正确的URI)。想法是将“组”或“用户”保存到它们各自的存储库中。

答案 1 :(得分:1)

首先,您需要HTML中的表单才能发送帖子,也可以使用jQueryJS发送帖子,但这将给代码增加其他复杂性。添加表单后,您将需要添加一种方法来捕获该请求。

HTML

<form th:action="@{/assign-group}" th:object="${newUser}" method="post">
    <select class="form-control" id="dropGroup" th:field="*{group.id}">
        <option value="0">Wybierz grupę : </option>
        <option th:each="selectedGroup : ${groupList}" th:value="${selectedGroup.id}" th:text="${group.name}">
        </option>
    </select>
    <select class="form-control" id="dropGroup" th:field="*{id}">
        <option value="0">Wybierz studenta : </option>
        <option th:each="selectedUser : ${userList}" th:value="${selectedUser.id}" th:text="${user.name}">
        </option>
    </select>
    <input name="submit" type="submit" value="submit" />
</form>

在这种形式下,您将发送一个用户实体,该用户实体的ID集和组ID也都被设置。还有一件事,您将看到我们正在使用th:object="${newUser}",这意味着我们需要在控制器中创建一个@ModelAttribute,以便它将新用户返回到您的表单。

CONTROLLER

@ModelAttribute(value = "newUser")
public Store newUser() {return new User();}

@RequestMapping(value = "/assign-group", method = RequestMethod.POST)
public String assignGroup(@ModelAttribute("newUser") User user) {
    // Fetch your the rest of the information using the id received.
    // Fetch the group using the group's id received.
    // Set this group to the fetched user.
}

如果您还有其他需要,请告诉我。