Java 从thymeleaf中的下拉选择中指定对象?

Java 从thymeleaf中的下拉选择中指定对象?,java,html,spring-boot,spring-mvc,thymeleaf,Java,Html,Spring Boot,Spring Mvc,Thymeleaf,我有一个像这样的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 cons

我有一个像这样的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>
我可以从下拉列表中列出角色,还可以成功地分配其他值,如name和id。但是,当我试图将下拉列表分配给
“*{role}”
时,它被破坏了

我得到一个例外:

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

从异常中我看到它是一个异常。我知道我可能会分配一个角色Id,然后再对其进行处理。但是,由于角色中有两个值(roleName和roleId),如何直接分配角色对象?可能吗?从单个下拉选择中分配role(id和roleName)两个值的任何替代方法?

一种方法是使用Spring类型转换服务将select的字符串值(如roleName)转换为角色实例

要使用此方法,需要执行几个步骤:

  • 创建接口
    转换器的实例。就我们的情况而言,它可以是
  • 公共类RoleNameToRoleConverter实现转换器
    
    可以找到有关spring转换的更多详细信息

  • 将此转换器注册到MVC配置中
  • @配置
    公共类WebConfig实现WebMVCConfiguer{
    @凌驾
    公共void addFormatters(FormatterRegistry注册表){
    addConverter(新的rolenametorleconverter());
    }
    }
    
    有关配置spring mvc类型转换的更多详细信息,请参见

  • th:value=“${role}”更改为
    th:value=“${role.roleName}”
  • 所有这些步骤都需要,因为HTML表单不能发送复杂的类型,比如对象,它总是发送简单的数字或字符串,在接受这个请求之后,SpringMVC需要知道如何将这些简单的值转换成复杂的对象

    此外,为了简化,您可以将仅包含角色名称的字符串的列表添加到模型中,而不是将整个角色附加到列表中

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