使用默认值显示UI中的枚举值(如果未选中)

时间:2017-11-08 05:15:43

标签: java spring-mvc enums thymeleaf

这里的问题分为两部分。第一部分更多是在UI上显示枚举,第二部分是处理不在服务端的枚举列表中的所选值。

首先。我有一个Enum类Gender定义如下。

public enum Gender {

    Male("M"),
    Female("F");

    private String name;

    private Gender(String name) {
        this.name = name;

    }
        public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

上面的枚举类在用户对象中引用,如下所示。

public class UserBO {

    private Gender gender;


    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

//other getters and setters

}

在控制器中,我通过执行此操作返回此userObject和性别的下拉列表。

@Controller
public class UserController {

    @Autowired
    private IUserService userServiceImpl;

    @RequestMapping(value = "/user/{userId}/official", method = RequestMethod.GET)
    public String getUserOfficialInfo(@PathVariable("userId") Integer userId, Model model) throws ServiceBusinessException {

                    UserBO userBO = userServiceImpl.findUserByUserId(userId);
                    model.addAttribute("user", userBO);
                    model.addAttribute("userId", userId);
                    model.addAttribute("genders", EnumSet.allOf(Gender.class));
                    return "official";
    }

现在,性别不是用户对象中的必填字段,因此对于某些用户而言,可能根本不会填充此字段。我该如何在UI上处理这个条件。我在UI上使用百里香。

我在百里香的尝试过的代码就是这个

<label class="control-label col-xs-2">Marital Status</label>
  <div class="col-xs-2">
        <select id="maritalStatus" name="maritalStatus">
            <option th:each="status : ${maritalStatuses}"
                                    th:value="${status}"
                                    th:text="${status}"
th:selected="${user.maritalStatus == null} ? 'Please select a Value' : ${status.equals(user.maritalStatus.name)}">
            </option>
        </select>
</div>

有人可以建议我如何处理这个问题?

同样来到问题的第二部分,假设用户没有在表单提交上选择任何性别,因为它不是必填字段。如何在UI上处理,以便服务不会在性别枚举列表中收到性别时抛出异常。

1 个答案:

答案 0 :(得分:1)

最简单的方法是在表单中使用th:object,如下所示:

<form th:object="${user}">
    <div class="form-group">
        <label class="control-label required"></label>
        <select id="maritalStatus" class="form-control required" th:field="*{maritalStatus}">
            <option value=""></option>
            <option th:each="status : ${maritalStatuses}" th:value="${status}" 
                th:text="${status}"></option>
        </select>
    </div>
    <div class="form-group">
        <label class="control-label"></label>
        <select id="gender" class="form-control" th:field="*{gender}">
            <option value=""></option>
            <option th:each="e : ${genders}" th:value="${e.name}" 
                th:text="${e}"></option>
        </select>
    </div>
</form>