[Java] Erstellen von Originalanmerkungen

Hintergrund

Wenn ich es mit vielen Anmerkungen im Originalmodell implementiert habe, erhielt ich eine Rezension mit der Aufschrift "Es ist schwer zu sehen. Wenn Sie also Ihre eigenen Anmerkungen erstellen und es verwenden, ist es einfacher zu sehen", habe ich es versucht.

before Controller-Klasse

@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping(path = "/sample")
public class SampleController {

/**
   *Beispieldatenerfassungs-API
   *
   * @Parameter-ID Beispieldaten-ID
   * @Rückgabe Detaillierte Informationen zu Beispieldaten
   */
  @GetMapping(path = "{id}", produces = "application/json; charset=UTF-8")
  @ResponseStatus(HttpStatus.OK)
  public Response getSampleDataDetails(@Nonnull @Pattern(regexp = "[0-9]{8}") 
                                       @PathVariable final String id) {
    log.info(String.format("SampleController { id : %s }", id));
    return idUseCase.getSampleDataDetails(id);
  }
}

Modellklasse

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ModelSample {

  @NotBlank
  @Size(max = 1024)
  private String name;

  @Digits(integer = 3, fraction = 2)
  private Double percentage;

}

after Controller-Klasse

@Validated
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping(path = "/sample")
public class SampleController {

  /**
   *Beispieldatenerfassungs-API
   *
   * @Parameter-ID Beispieldaten-ID
   * @Rückgabe Detaillierte Informationen zu Beispieldaten
   */
  @GetMapping(path = "{id}", produces = "application/json; charset=UTF-8")
  @ResponseStatus(HttpStatus.OK)
  public Response getSampleDataDetails(@Id @Valid @Nonnull
                                       @PathVariable final String id) {
    log.info(String.format("SampleController { id : %s }", id));
    return idUseCase.getSampleDataDetails(id);
  }
}

Modellklasse

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Validated
public class ModelSample {

  @Name
  @Valid
  private String name;

  @Percentage
  @Valid
  private Double percentage;

}

Anmerkungsklasse erstellen

Sie können spüren, dass die Anmerkungen vorher / nachher aktualisiert werden. Um dies zu realisieren, erstellen Sie zunächst eine Anmerkungsklasse.

Anmerkungsklasse für id

@Target(ElementType.PARAMETER)
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Pattern(regexp = "[0-9]{8}")
@Nonnull
public @interface Id {

  String message() default "id: don't match format";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

}

Kommentar

@Target Das Argument "@ Target" gibt an, wo die Anmerkung angewendet werden soll.

Wert Wo bewerben?
ElementType.TYPE Klasse, Schnittstelle, Anmerkung, Aufzählungstyp
ElementType.FIELD Feld
ElementType.CONSTRUCTOR Konstrukteur
ElementType.METHOD Methode

@Retention Geben Sie im Argument "@ Retention" den Bereich an, in dem die Anmerkung gespeichert werden soll.

Wert Reichweite zu halten
RetentionPolicy.RUNTIME Zur Laufzeit halten.
RetentionPolicy.CLASS In der Klassendatei aufbewahren. (Wird zur Laufzeit nicht beibehalten.)
RetentionPolicy.SOURCE In der Quelldatei aufbewahren. (Es wird nicht in der Klassendatei gespeichert.)

Wenn Sie * @Retention nicht hinzufügen, ist "RetentionPolicy.CLASS" die Standardeinstellung.

@Constraint Geben Sie im Argument "@ Constraint", Attribut "validateBy", die Validierung an, die von dieser Annotation ausgeführt werden soll. Wenn Sie Ihren eigenen Validierungsprozess implementieren möchten, geben Sie hier die Validatorklasse an, die den Prozess implementiert. Dieses Mal erstellen wir eine Kombination vorhandener Einschränkungen, sodass dieses Argument leer bleibt.

Einschränkungsanmerkung

Fügen Sie Ihrer eigenen Anmerkungsklasse Einschränkungsanmerkungen wie "@ Pattern" und "@ Nonnull" hinzu. Die hier hinzugefügte Anmerkung wird überprüft, wenn die Klasse anhand der ursprünglichen Anmerkung überprüft wird.

@interface Sie können Ihre eigenen Anmerkungen definieren, indem Sie "@ interface" verwenden.

message Geben Sie für "Nachricht" die Nachricht an, wenn die Einschränkung verletzt wird.

groups groups gibt ein Attribut an, um zu bestimmen, ob die Einschränkungsprüfung abhängig von der Situation ausgeführt werden soll. Mit dem Attribut groups können Sie Einschränkungen in einer beliebigen Gruppe gruppieren und diese Gruppe bei der Validierung angeben, um unterschiedliche Einschränkungen für jede Gruppe zu überprüfen. Dieses Mal ist es nicht erforderlich, sie zu gruppieren, daher wird sie leer implementiert.

payload payload gibt ein Attribut an, das eine beliebige Kategorie wie den Schweregrad für Verstöße gegen Einschränkungen angibt. Ich werde es nach Bedarf verwenden, aber dieses Mal gibt es keine bestimmte Kategorie, daher implementiere ich es leer.

List List ist eine verschachtelte Annotation und wird verwendet, wenn dieselbe Einschränkung unter verschiedenen Bedingungen mehrmals definiert wird. Dieses Mal verwenden wir nicht dieselbe Einschränkung, da wir sie unter verschiedenen Bedingungen nicht mehrmals definieren.

Erstellen Sie andere Anmerkungsklassen

Erstellen Sie auf ähnliche Weise Anmerkungen für "Name" und "Prozentsatz".

Anmerkungsklasse für name

@Target(ElementType.FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Size(max = 1024)
@NotBlank
public @interface Name {
  String message() default "name: don't match format";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};
}

Anmerkungsklasse für "Prozentsatz"

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@Digits(integer = 3, fraction = 2)
public @interface Percentage {
  String message() default "percentage: don't match format";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};
}

Kommentar

@Size Gibt an, dass die Länge der Zeichenfolge im Zielfeld innerhalb des angegebenen Größenbereichs liegt.

@Digits Geben Sie für "Ganzzahl" die maximale Anzahl von Stellen für den ganzzahligen Teil und für "Bruch" die maximale Anzahl von Stellen für den Bruchteil an. "@Digits (Ganzzahl = 3, Bruch = 2)" bedeutet, dass "von der maximalen Anzahl von Stellen 2 Stellen das Maximum nach dem Dezimalpunkt sind".

Fügen Sie Anmerkungen zu verwendeten Klassen hinzu

Controller-Klasse

@Validated
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping(path = "/sample")
public class SampleController {

  /**
   *Beispieldatenerfassungs-API
   *
   * @Parameter-ID Beispieldaten-ID
   * @Rückgabe Detaillierte Informationen zu Beispieldaten
   */
  @GetMapping(path = "{id}", produces = "application/json; charset=UTF-8")
  @ResponseStatus(HttpStatus.OK)
  public Response getSampleDataDetails(@Id @Valid @Nonnull
                                       @PathVariable final String id) {
    log.info(String.format("SampleController { id : %s }", id));
    return idUseCase.getSampleDataDetails(id);
  }
}

Modellklasse

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Validated
public class ModelSample {

  @Name
  @Valid
  private String name;

  @Percentage
  @Valid
  private Double percentage;

}

wichtiger Punkt

Bonus: Erstellen Sie Ihren eigenen Validierungsprozess

Möglicherweise möchten Sie Ihren eigenen Validierungsprozess hinzufügen, anstatt vorhandene Einschränkungen zu kombinieren, um eine Anmerkung wie diese zu erstellen. In diesem Fall implementieren wir die Validator-Klasse. Wir werden den diesmal erstellten ID-Validierungsprozess implementieren.

Anmerkungsklasse für id

@Target(ElementType.PARAMETER)
@Retention(RUNTIME)
@Constraint(validatedBy = {idValidator.class})
@Pattern(regexp = "[0-9]{8}")
@Nonnull
public @interface Id {

  String message() default "id: don't match format";

  Class<?>[] groups() default {};

  Class<? extends Payload>[] payload() default {};

}

Implementierungsklasse für die Validierungsverarbeitung

public class IdValidator implements ConstraintValidator<id, String> {

@Override 
   public void initialize(Id id) {} 

@Override 
   public boolean isValid(String value, ConstraintValidatorContext context) { 
     String pattern = "[0-9]{8}"; 
     if (!StringUtils.isEmpty(value)) {
       return value.matches(pattern);
     }
     return false; 
   } 
 } 

Beschreibung der ID-Klasse

@Constraint Legen Sie die Validierungsverarbeitungsklasse in "@ Constraint" fest.

Kommentar zur IdValidator-Klasse

ConstraintValidator<A,T> Varidata muss "ConstraintValidator <A, T>" implementieren. A ist die Einschränkungsanmerkung und T ist der Eingabewerttyp. Dieses Mal habe ich selbst eine Einschränkungsanmerkung erstellt und diese unter der Annahme implementiert, dass A die ID-Klasse und T den Wert als Zeichenfolge erhält.

A wird initialisiert und T ist der Argumenttyp von isValid.

initialize Mit initialize können Sie den Attributwert der in der JavaBeans-Eigenschaft festgelegten Einschränkungsanmerkung abrufen. Diesmal brauche ich es nicht, also habe ich es leer erstellt.

isValid Wenn die Validierung mit "isValid" durchgeführt wird und der Rückgabewert false ist, wird ConstraintVaiolation als Validierungsfehler generiert. Der Prozess wird hier beschrieben. Dieses Mal wird bestimmt, ob der empfangene Wert mit dem regulären Ausdruck übereinstimmt und true oder false zurückgibt. Wenn es überhaupt nicht in der if-Anweisung enthalten ist, kann festgestellt werden, dass der empfangene Wert kein String ist, sodass false zurückgegeben wird.

Fügen Sie Anmerkungen zu verwendeten Klassen hinzu

Die Verwendung ist dieselbe wie beim Erstellen durch Kombinieren vorhandener Anmerkungen.

@Validated
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping(path = "/sample")
public class SampleController {

  /**
   *Beispieldatenerfassungs-API
   *
   * @Parameter-ID Beispieldaten-ID
   * @Rückgabe Detaillierte Informationen zu Beispieldaten
   */
  @GetMapping(path = "{id}", produces = "application/json; charset=UTF-8")
  @ResponseStatus(HttpStatus.OK)
  public Response getSampleDataDetails(@Id @Valid @Nonnull
                                       @PathVariable final String id) {
    log.info(String.format("SampleController { id : %s }", id));
    return idUseCase.getSampleDataDetails(id);
  }
}

Bitte beachten Sie auch hier Folgendes.

Zusammenfassung

Mir wurde gesagt: "Machen Sie Ihre eigenen Anmerkungen!" Und ich lernte, dass Sie Ihre eigenen Anmerkungen machen können. Als ich es tatsächlich geschafft habe, wurde die Modellklasse viel sauberer und leichter zu sehen. Ich fand es ein Verdienst, dass es einfacher wurde zu verstehen, welche Art von Validierung auf jeden angewendet wurde. Das Implementieren der Annotationen war nicht so schwierig, aber es dauerte eine Weile, bis mir klar wurde, dass es ohne die "@ Validated" und "@ Valid" im Controller und die Klassen, die die Annotationen verwenden, nicht funktionieren würde.

Referenzmaterial

Erste Schritte mit Java EE 7 (23) - Grundlagen der Bean-Validierung http://enterprisegeeks.hatenablog.com/entry/2016/02/15/072944

Erste Schritte mit Java EE 7 (24) - Erstellen Sie benutzerdefinierte Einschränkungen mit Bean Validation http://enterprisegeeks.hatenablog.com/entry/2016/02/29/072811

Funktionsdetails von TERASOLUNA Global Framework --5.5 Eingabeprüfung https://terasolunaorg.github.io/guideline/public_review/ArchitectureInDetail/Validation.html#validation-basic-validation

Recommended Posts

[Java] Erstellen von Originalanmerkungen
Geschichte der Java-Annotationen
[Java] Anmerkung
[Java] Anmerkung
Erstellung von Java-Dateien
Erstellung eines Java-Verzeichnisses
[Java] Übersicht über Java
Automatische Erstellung eines Java-Unit-Testergebnisberichts
Abgelaufene Java-Sammlung
Voraussichtliche Funktionen von Java
[Java] Bedeutung der serialVersionUID
Eclipse ~ Java-Projekterstellung ~
Verwenden Sie die ursprüngliche Markierungsanmerkung
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
Java - Vereinigung von Kommentaren
Java (Verdienste des Polymorphismus)
NIO Bewertung von Java
[Java] Drei Funktionen von Java
Zusammenfassung der Java-Unterstützung 2018
Java Discord Bot-Erstellung
[Java] Taschenrechnerprogramm erstellen 1
[Inhouse-Studiensitzung] Grundlagen der Java-Annotation (02.11.2017) ~ Im Aufbau ~
Erstellen Sie mit Gradle ein Java-Multiprojekt
Über Java-Instanzen
[Java] Mirage-Basic-Verwendung von SQL
[Java] Praxis der Ausnahmebehandlung [Ausnahme]
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
Grundlagen der Zeichenoperation (Java)
Java-Lerntag 4
[Java] Anfängerverständnis von Servlet-①
Java Ende des Monats plusMonate
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
[Java] Implementierung des Faistel-Netzwerks
[Java] Komparator der Collection-Klasse
Zusammenfassung der Grundlagen der Java-Sprache
Zusammenfassung der Java Math Klasse
Aufzählung aller Kombinationen Java
Java (Vererbung von is-ein Prinzip)
Vor- und Nachteile von Java
Vorteile der statischen Java-Methode
[Java] Zusammenfassung der Steuerungssyntax
Java-Implementierung von Tri-Tree
Zusammenfassung der Java-Fehlerverarbeitung
[Java] Zusammenfassung der Entwurfsmuster
[Java] Zusammenfassung der mathematischen Operationen
[Read Effective Java] Kapitel 2 Punkt 5 "Vermeiden Sie die Erstellung unnötiger Objekte"
[Java] Geschwindigkeitsvergleich der Zeichenfolgenkombination
Denken Sie an eine Java-Update-Strategie
[Java] Löschen Sie die Elemente von List
[Für Anfänger] Zusammenfassung des Java-Konstruktors
Verschiedene Methoden der Java String Klasse
Grundursache für Java Framework Bug
Über Biocontainer fastqc und Java
[Java Edition] Geschichte der Serialisierung
Über Lambda, Stream, LocalDate von Java8
Erstellung der Play Framework 2.6 (Java) -Entwicklungsumgebung
Lesen Sie CSV in Java (Super CSV Annotation)