【问题标题】:Assigning object from dropdown selection in thymeleaf?从百里香的下拉选择中分配对象?
【发布时间】:2020-07-13 03:11:28
【问题描述】:

我有一个像这样的 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";
    }

我可以从下拉列表中列出角色,还可以成功分配其他值,例如名称和 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,然后再处理它,因为角色中有 2 个值(roleName 和 roleId),我如何直接分配角色对象?可能吗?是否有任何替代方法可以从单个下拉选择中分配角色(id 和 roleName)的两个值?

【问题讨论】:

    标签: java html spring-boot spring-mvc thymeleaf


    【解决方案1】:

    一种方法是使用 Spring Type Conversion 服务将 select 的字符串值(如 RoleName)转换为 Role 实例。

    对于使用这种方法需要做几个步骤:

    1. 创建接口Converter&lt;S,T&gt; 的实例。对于我们的例子,它可以是
    public class RoleNameToRoleConverter implements Converter<String,Role>
    

    更多关于spring转换的详情可以查看here

    1. 将此转换器注册到 MVC 配置中
    @Configuration
    public class WebConfig implements WebMvcConfigurer {
    
        @Override
        public void addFormatters(FormatterRegistry registry) {
         registry.addConverter(new RoleNameToRoleConverter ());    
        }
    }
    

    更多关于配置spring mvc类型转换的细节可以看here

    1. th:value="${role}"改成th:value="${role.roleName}"

    所有这些步骤都需要,因为 HTML 表单无法发送对象等复杂类型,它总是发送简单的数字或字符串,在接受此请求后 SpringMVC 需要知道如何将这些简单的值转换为复杂的对象。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 2019-10-14
      • 2020-10-31
      • 2018-04-25
      • 2019-08-10
      • 2018-11-08
      • 2018-05-26
      • 1970-01-01
      相关资源
      最近更新 更多