Назначение объекта из выпадающего списка в тимелист? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть такой класс pojo

pulic class Role{
private int roleId;
private String roleName;

//default getters setters and constructors

Другой пользователь класса POJO

public class User{

private String id;
private String name;
private Role role;

// standard getters setters and constructors

Мой метод класса контроллера для вызова страницы

    @GetMapping("/adduser")
    public String registerUserPage(Model model){

        model.addAttribute("roles",roles.listRoles());
        User user = new User();
        user.setRole(new Role());
        model.addAttribute("user",user);

        return "adduser";
    }

adduser . html

<!DOCTYPE HTML>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="https://www.thymeleaf.org"
      xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
    <title>test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>

<form name="registerForm" th:action="@{/createUser}" th:object="${user}" method="POST">
    <div><label> First Name : <input type="text" th:field="*{name}"/> </label></div>
    <div><label> Id : <input type="text" th:field="*{id}"/> </label></div>
        <select th:field="*{role}">
            <option value="">Select Test Order</option>
            <option th:each="role : ${roles}"
                    th:value="${role}"
                    th:text="${role.roleName}"></option>
        </select>

    <div><input type="submit" value="Add"/></div>
</form>
</body>
</html>

И контроллер createUser

    @PostMapping("/createUser")
    public String registerUser(@ModelAttribute("user") User user, Model model){
        System.out.println(digiUser.getName); //this works
        System.out.println(digiUser.getRole().getRoleName()); //how??
        return "ok";
    }

Я могу перечислять роли из выпадающего списка, а также успешно назначать другие значения, такие как имя и идентификатор. Однако, когда я попытался назначить выпадающий список "*{role}", он сломался ..

я получил исключение:

 default message [Failed to convert property value of type 'java.lang.String' to required type 'com.vipin.data.Role' for property 'role';

Из исключения я вижу, что это исключение приведения. Я знаю, что, возможно, смогу назначить идентификатор роли и позже обработать его, так как в роли есть 2 значения (roleName и roleId), как я могу назначить объект роли напрямую? Является ли это возможным? Какие-либо альтернативные подходы для назначения обоих значений роли (id и roleName) формы одиночного выпадающего выбора?

1 Ответ

0 голосов
/ 02 апреля 2020

Один из подходов заключается в использовании службы преобразования типов Spring для преобразования строкового значения select, такого как RoleName, в экземпляр Role.

Для использования этого подхода необходимо выполнить несколько шагов:

  1. Создать экземпляр интерфейса Converter<S,T>. В нашем случае это может быть
public class RoleNameToRoleConverter implements Converter<String,Role>

Более подробную информацию о преобразовании пружины можно найти здесь

Зарегистрируйте этот преобразователь в MVC конфигурацию
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addFormatters(FormatterRegistry registry) {
     registry.addConverter(new RoleNameToRoleConverter ());    
    }
}

Подробнее о конфигурации пружины mvc тип преобразования можно найти здесь

Изменить th:value="${role}" на th:value="${role.roleName}"

Все эти шаги необходимы, потому что HTML форма не может отправлять сложные типы, такие как объект, она всегда отправляет простые числа или строки и после принятия этого запроса Spring MVC должен знать, как преобразовать эти простые значения в сложные объекты.

Кроме того, для упрощения вы можете добавить в модель только список, содержащий строки с именами ролей, вместо того, чтобы прикреплять список со всеми ролями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...