Как Thymeleaf Controller использует DTO для автоматического сопоставления сущностей? - PullRequest
0 голосов
/ 05 ноября 2019

Так что вопрос немного странный, но здесь задействовано так много вещей, что я не знаю, как его спросить:)

Итак, давайте начнем с верха.

Для удобства чтения я удалил большую часть кода.

На моей странице Thymeleaf есть следующее:

<form th:action="@{/admin/addAdmin}" th:object="${adminDTO}" method="post">
    <select th:field="*{userRole}">
        <option value="">Select</option>
        <option th:each="eot : ${userRoleList}" th:value="${eot.roleId}" th:text="${eot.roleDesc}"></option>
    </select>
</form>

Мой класс AdminDTO:

public class AdminDTO {

   private String userName;

   @NotNull
   private UserRole userRole;

   //Getter and Setters

UserRole - это класс Database Entity, и он выглядит примерно так:

@Entity
@Table(name = "user_role")
public class UserRole implements Serializable {

   @Id
   @Column(name = "role_id")
   private long roleId;

   @NotBlank
   @Column(name = "role_desc")
   private String roleDesc;

   //Getter and Setters

Мой класс контроллера:

@PostMapping("/admin/addAdmin")
public String postAddAdmin(Model model, @Valid @ModelAttribute("adminDTO") AdminDTO adminDTO, BindingResult bindingResult) {

   if (bindingResult.hasErrors()) {
      model.addAttribute("error", "Please complete all fields correctly!");
      return "/admin/addAdmin";
   } else {
      model.addAttribute("success", "NICE!!");
      return "/admin/addAdmin";
   }
}

Когда я тестирую этот код, работающий в Tomcat и использующий мой браузер, онработает отлично. При выборе роли пользователя на html-странице Thymeleaf и ее отправке передается идентификатор роли пользователя, равный 1, и где-то перед попаданием в контроллер объект UserRole сопоставляется с объектом UserDTP. BindingResult не имеет ошибок, и все работает хорошо.

Но когда я пытаюсь проверить это с помощью класса Test, приведенного ниже, то BindingResult имеет ошибки, касающиеся UserRole, не может быть нулевым.

Мой тестовый класс / метод:

@Test
public void postAddAdmin() throws Exception {
   this.mockMvc.perform(post("/admin/addAdmin")
            .param("userName", "User")
            .param("userRole", "1"))
            .andExpect(status().isOk())
            .andExpect(view().name("/admin/addAdmin"));
}

Этот тест завершается неудачно с UserRole, равным нулю, когда он попадает в контроллер.

Итак, мой вопрос состоит из двух частей: 1. Как происходит автоматическое связывание при отправке с использованиемформа Thymeleaf? 2. Почему мой тест не выполняет ту же функцию автоматического связывания и как я могу это исправить?

Надеюсь, я все это рассмотрел, поэтому, пожалуйста, спросите, нужно ли мне что-то изменить или обновить.

Спасибо

...