如何在Thymeleaf下拉菜单中使用对象

时间:2018-07-29 09:00:37

标签: java spring-mvc spring-boot thymeleaf

我是Thymeleaf的新手,并且遇到了一个奇怪的问题。让我告诉你首先起作用的是什么。我有两个简单的课程

public class Country {

    private long countryid;

    private String name;
}

public class Person {

    private String name;

    private long countryId;
}

在addPerson页面中,我想从下拉列表中选择国家。我已经手动创建了一个国家列表(通过spring控制器),然后将addPerson.html设计为

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Add Person</h1>
    <form action="#" th:action="@{/addPerson}" th:object="${person}"
        method="POST">
        <p>
            Name: <input type="text" th:field="*{name}" />
        </p>
        <select th:field="*{countryId}" class="form-control">
            <option th:each="country: ${countryList}"
                th:value="${country.countryid}" th:text="${country.name}"></option>
        </select>
        <p>
            <input type="submit" value="Submit" /> <input type="reset"
                value="Reset" />
        </p>
    </form>
</body>
</html>

当我从下拉列表中选择一个国家/地区时,我会得到该国家/地区编号,并且一切正常。 现在,我想如下更改我的Person类

public class Person {

    private String name;

    private Country country;
}

因此,我想使用country对象本身而不是countryid。保持其他所有内容不变,我将addPerson.html更改为

<select th:field="*{country}" class="form-control">
            <option th:each="country: ${countryList}"
                th:value="${country}" th:text="${country.name}"></option>
</select>

现在我可以看到下拉列表,但是提交后,我得到了一个错误

  

发生意外错误(类型=错误请求,状态= 400)。   对object ='person'的验证失败。错误计数:1

简而言之:它可以与对象的属性一起使用,我需要做什么才能处理整个对象本身?

请帮助。

更新1:控制器方法签名

@GetMapping("/addPerson")
    public String addPerson(Model model) {

        Country country1 = new Country();
        country1.setCountryid(1);
        country1.setName("A");

        Country country2 = new Country();
        country2.setCountryid(2);
        country2.setName("B");

        List<Country> countryList = new ArrayList<Country>();
        countryList.add(country1);
        countryList.add(country1);

        model.addAttribute("countryList", countryList);
        model.addAttribute("person", new Person());
        return "addPerson";
    }

    @PostMapping("/addPerson")
    public void processAddPerson(@Valid @ModelAttribute("person") Person person) {

        System.out.println(person.getName());

    }

更新2 调试后,我发现在第二种情况下,在提交时,控件根本不会使用Person类的setCountry方法!

1 个答案:

答案 0 :(得分:0)

将BindingResult对象添加到您的方法。

 public String processAddPerson( @Valid Person person,BindingResult bindingResult,Model model)

确保在BindingResult注释的对象之后必须立即@Valid