web-dev-qa-db-ja.com

SpringとThymeleafを使用してドロップダウンリストにすべての可能な列挙値を表示する方法は?

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";
}
28
stevecross

できること:

<select>
    <option th:each="state : ${T(com.mypackage.Ticket.State).values()}"
            th:value="${state}"
            th:text="${state}">
    </option>
</select>
66
jchampemont

さらに、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のようなプロパティをこのように追加できます。

20
fkurth

これは私のために働いた:

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>