[JAVA] Tipps zum Umgang mit Enum mit Thymeleaf

Dieses Jahr war ich an Projekten beteiligt, die Spring Boot verwenden, und ich habe die Erkenntnisse organisiert, die ich über Thymeleaf und Enum gewonnen habe.

Dinge, die oft auftauchen, wenn Sie mit "Thyme leaf enum" googeln

Bei Spring oder Spring Boot ist es üblich, Thymeleaf mit der Template-Engine zu verwenden. Es ist üblich, enum zu verwenden, um den Wert und den Anzeigenamen des Auswahlfelds des Eingabeformulars zu verwalten.

Auszug aus https://www.baeldung.com/thymeleaf-enums, aber wenn Sie googeln, sehen Sie einige Beispiele wie das folgende.

<select name="color">
    <option th:each="colorOpt : ${T(com.baeldung.thymeleaf.model.Color).values()}"
        th:value="${colorOpt}" th:text="${colorOpt.displayValue}"></option>
</select>

Es gibt auch ein solches Beispiel bei der Beurteilung, ob es sich um eine bestimmte Aufzählung handelt, indem der Anfangswert beurteilt wird.

<div th:if="${widget.color == T(com.baeldung.thymeleaf.model.Color).RED}">

Die Schwierigkeit bei dieser Methode

Ich sehe es oft, aber wenn es um das Beste geht, kann ich nichts sagen.

  1. Der FQDN-Teil des Typs ist schwer zu lesen (es gibt lange Zeit keine Informationsmenge).
  2. Wenn Sie versuchen, die Paketstruktur zu überprüfen, müssen Sie die Vorlage ändern
  3. Auch beim Umbenennen von enum muss die Vorlage geändert werden.

Der Punkt ist, dass etwas hereinkommt, das nichts mit der Vorlage zu tun hat, was sich negativ auf die Lesbarkeit und Wartbarkeit auswirkt. Wenn Sie etwas machen möchten, das vorerst funktioniert, ist diese Methode in Ordnung, aber ein wenig schmerzhaft.

Was ist zu tun

Grundsätzlich ist es eine gute Idee, das, was Sie in der Vorlage verwenden, in enum zu implementieren. Anstatt direkt von der Vorlage aus aufzurufen, ist es besser, das Formular so zu ändern, dass die erforderliche Instanz vom Controller übergeben wird.

Bei Verwendung aller Elemente der Aufzählung (Auswahlfeld usw.)

Java enum hat eine implizite Methode namens "public static T [] values ()". Verwenden Sie diese Option, um alle Elemente aufzulisten. (Apropos Klassiker, es ist eine klassische Geschichte.)


public enum UserStatus {
   ACTIVE(1, "Wirksamkeit"),
   INACTIVE(0, "Ungültig"),
   PENDING(2, "in Wartestellung"),
   FORBIDDEN(3, "Zwangsstopp")
   ;

   private final int value;

   private final String viewName;

   private UserStatus(int value, String viewName) {
       this.value = value;
       this.viewName = viewName;
   }

   public int getValue() {
       return this.value;
   }

   public String getViewName() {
       return this.viewName;
   }

}

@Controller
public class SampleController

@RequestGetMapping
public ModelAndView index() {
   ModelAndView model = new ModelAndView();
   model.setAttribute("statusList", UserStatus.values());
   return model;
}

<select name="status">
    <option th:each="status : statusList}" 
            th:value="${status.value}" th:text="${status.viewName}">
    </option>
</select>

Formulareingabe als Aufzählung erhalten

Die obige Methode ist unpraktisch, um den Wert als Aufzählung zu erhalten. enum hat implizit die Methoden name () undvalueOf (String name)deklariert.

Der Name für "name ()" wird zurückgegeben, und "valueOf (String name)" gibt die entsprechende Instanz zurück, wenn die Namen übereinstimmen. Der Frühling wird diese für Sie verwenden.

<select name="status">
    <option th:each="status : statusList}" 
            th:value="${status.name()}" th:text="${status.viewName}">
    </option>
</select>
public class NewUserForm {

  private UserStatus status;

  // ... 

}
@RequestPutMapping
public ModelAndView create(NewUserForm form) {
   ModelAndView model = new ModelAndView();
   // ... 
   return model;
}

Anschließend kann die Auswahl im Formular einer Aufzählung zugeordnet und empfangen werden.

Beurteilung einer bestimmten Aufzählung

Es gibt eine Möglichkeit, eine Methode namens isXXX zu enum hinzuzufügen.


public enum UserStatus {
   // ...

   public boolean isActive() {
       return this == ACTIVE;
   }

   public boolean isForbidden() {
       return this == FORBIDDEN;
   }

}
<div th:if="${status.isForbidden()}">
    This user is forbidden.
</div>

Diese isXXX-Methode ist nicht nur für Vorlagen nützlich, sondern auch zum Schreiben von Geschäftslogik. Wenn Sie beispielsweise nur gültige Benutzer eingrenzen möchten, sieht dies folgendermaßen aus.


public class User {

  //...

  private final UserStatus status;

  public UserStatus getStatus() {
     return this.status
  }

}

   List<User> users = ...
   List<User> activeUsers = users.stream()
                                 .filter(x -> x.getStatus().isActive())
                                 .collect(Collectors.toList());

Zusammenfassung

Möglicherweise finden Sie die Best Practices in Ihrer Nähe oder nicht. Es ist auch selten herauszufinden, ob die durch die Suche gefundene Methode für Ihre aktuelle Situation geeignet ist oder nicht. Vorlagen sind leicht in viele Interessen einzubeziehen, daher müssen Sie bei der Implementierung viele Entscheidungen treffen.

Referenzlink

Recommended Posts

Tipps zum Umgang mit Enum mit Thymeleaf
Tipps zum Umgang mit Pseudoelementen in Selen
Tipps für java.nio.file.Path
Machen Sie einen Ausschnitt für Thymeleaf in VS Code
Tipps zum Generieren von Dateien für Eclipse-Projekte mit Gradle
Tipps zum Festlegen der anfänglichen Verzögerung für Poller in XML
Tipps zur guten Verwendung von Canvas mit Xcode
Fehlerbehandlung mit Graphql-Ruby
Tipps zur Verwendung von Salesforce SOAP und Bulk API in Java
Siehe Aufzählung in Thymeleaf
[Ruby] Ausnahmebehandlung in Funktionen
Gradle TIPS-Sammlung (für mich)
[Java] Tipps zum Schreiben der Quelle
Ausnahmebehandlungstechniken in Java
Tipps zum Generieren von API
Nutzen Sie entweder für die individuelle Ausnahmebehandlung in der Java Stream-API