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;
}
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 {};
}
@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.
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 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 {};
}
@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".
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;
}
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;
}
}
@Constraint Legen Sie die Validierungsverarbeitungsklasse in "@ Constraint" fest.
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.
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.
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.
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