Enumプロパティを持つドメインオブジェクトがあり、このオブジェクトのフォームにすべての可能な列挙値を含むドロップダウンリストを表示したい。次のオブジェクトを想像してください。
public class Ticket {
private Long id;
private String title;
private State state;
// Getters & setters
public static enum State {
OPEN, IN_WORK, FINISHED
}
}
私のコントローラーには、このオブジェクトのフォームをレンダリングするメソッドがあります:
@RequestMapping("/tickets/new")
public String showNewTicketForm(@ModelAttribute Ticket ticket) {
return "tickets/new";
}
テンプレートは次のようになります。
<form th:action="@{/tickets}" method="post" th:object="${ticket}">
<input type="text" th:field="*{title}" />
<select></select>
</form>
その後、次のように変換する必要があります。
<form action="/tickets" method="post">
<input type="text" name="title" />
<select name="state">
<option>OPEN</option>
<option>IN_WORK</option>
<option>FINISHED</option>
</select>
</form>
選択タグを作成するにはどうすればよいですか?コントローラで次のようなことができるように、選択した値もチケットに自動的にマッピングされる必要があります。
@RequestMapping(value = "/tickets", method = RequestMethod.POST)
public String createTicket(@Valid Ticket ticket) {
service.createTicket(ticket);
return "redirect:/tickets";
}
できること:
<select>
<option th:each="state : ${T(com.mypackage.Ticket.State).values()}"
th:value="${state}"
th:text="${state}">
</option>
</select>
さらに、GUIに表示される文字列から列挙型の序数名を分離する場合は、追加のプロパティを追加します。たとえば、displayName:
public static enum State {
OPEN("open"),
IN_WORK("in work"),
FINISHED("finished");
private final String displayName;
State(String displayName) {
this.displayName = displayName;
}
public String getDisplayName() {
return displayName;
}
}
そして、htmlファイルで:
<select>
<option th:each="state : ${T(com.mypackage.Ticket.State).values()}" th:value="${state}" th:text="${state.displayName}"></option>
</select>
これにより、ユーザーにdisplayNameが提示され、コードをリファクタリングせずにこの文字列を後から静かに変更できます。 th:titleのようなプロパティをこのように追加できます。
これは私のために働いた:
public enum RoleEnum {
SUPER_ADMIN("SUPER_ADMIN"),
RESTAURANTE_ADMIN("RESTAURANTE_ADMIN");
private final String roleCode;
private RoleEnum(String roleCode) {
this.roleCode = roleCode;
}
}
<select class="form-control" id="val-skill" name="role_id">
<option th:each="role : ${T(com.users.enumeration.RoleEnum).values()}" th:value="${role}" th:text="${role}"></option>
</select>