[Java] Où est la classe d'implémentation de l'annotation qui existe dans BeanValidation?

Contexte

Lors de l'implémentation de la validation dans Java ou Spring, vous pouvez utiliser la validation de bean comme @ NotNull ou @ NotBlank.

Lors de la mise en œuvre, je me suis demandé quelle était la classe d'implémentation associée à ces annotations, alors j'ai regardé le code source, mais le validatedBy de @ Constraint était vide. ..

Prenez l'annotation NotBlank [^ 1] dans le package javax.validation.constraints comme exemple.

NotBlank.java


@Documented
@Constraint(validatedBy = { }) //La classe dans laquelle le contenu de la validation est écrit n'est pas spécifiée par ←
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Repeatable(List.class)
public @interface NotBlank {

	String message() default "{javax.validation.constraints.NotBlank.message}";

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

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

	/**
	 * Defines several {@code @NotBlank} constraints on the same element.
	 *
	 * @see NotBlank
	 */
	@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
	@Retention(RUNTIME)
	@Documented
	public @interface List {
		NotBlank[] value();
	}
}

Cette fois, j'ai étudié la classe associée à l'emplacement du résultat d'implémentation de cette annotation.

Résultats du sondage

Lorsque j'ai cherché sur Google, la même question a été posée dans stackoverflow de ici, et j'ai pu connaître la classe d'implémentation. ..

C'est ici org NotBlankValidator sous .hibernate.validator.internal.constraintvalidators.bv.

À partir de là, il a été constaté que l'annotation et sa classe d'implémentation ne sont pas dans la même bibliothèque, mais dans des bibliothèques différentes.

De plus, la classe qui les lie existe dans la même bibliothèque que la classe d'implémentation, et [ici](https://github.com/hibernate/hibernate-validator/blob/db7ae586508add6491f1443c8ab4e770d7cb2c20/engine/src/main/java/org Il s'est avéré qu'il est lié par la classe ConstraintHelper sous org.hibernate.validator.internal.metadata.core (/hibernate/validator/internal/metadata/core/ConstraintHelper.java).

Résumé

Cette fois, j'ai trouvé que la classe d'implémentation de l'annotation qui existe dans javax.validation.constraints de BeanValidation existe sous org.hibernate.validator.internal.constraintvalidators.bv.

Nous avons également constaté que ces classes sont liées par la classe ConstraintHelper sous org.hibernate.validator.internal.metadata.core.

Cependant, je ne comprends pas pourquoi l'annotation et la classe d'implémentation prennent la peine d'exister dans différentes bibliothèques. Il semble que la relation entre BeanValidation et Hibernate soit liée, mais est-ce comme séparer l'interface et l'implémentation en tenant compte de l'extensibilité?

Si quelqu'un est au courant de ce point, j'apprécierais que vous me le disiez.

Jusqu'à la fin Merci d'avoir lu.

Les références

Site qui a déclenché la solution

NotBlankValidator.java

ConstraintHelper.java

Recommended Posts

[Java] Où est la classe d'implémentation de l'annotation qui existe dans BeanValidation?
Ceci et cela de la mise en œuvre du jugement en temps réel des dates en Java
[Java] Est-il inutile de vérifier "l'identité" dans l'implémentation de la méthode equals ()?
Récapitulez les éléments supplémentaires de la classe Optional dans Java 9
L'histoire que .java est également construite dans Unity 2018
[Spring Boot] L'histoire selon laquelle le bean de la classe avec l'annotation ConfigurationProperties n'a pas été trouvé
Implémentation Java de tri-tree
[Rails] Où faire attention dans la description de la validation
Où est le fuseau horaire de Java LocalDateTime.now ()?
Implémentation d'une fonction similaire en Java
Mécanisme et caractéristiques de la classe d'implémentation Collection souvent utilisés en Java
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
Examinez la liste des ID de fuseau horaire disponibles dans la classe Java ZoneId
Lorsque le nom de la classe du bean est dupliqué
Qu'est-ce qu'une classe en langage Java (3 /?)
Implémentation de DBlayer en Java (RDB, MySQL)
Obtenez le résultat de POST en Java
Code de la partie où server.servlet.session.timeout est défini dans spring.session.timeout dans le système spring-boot2
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce qu'une classe en langage Java (2 /?)
Quelle est la méthode principale en Java?
Où la fonction de suivi est implémentée
Erreur lors de la finalisation du membre de la classe Entity utilisé dans SpringWebFlux
Exemple de programme qui renvoie la valeur de hachage d'un fichier en Java
À partir de Java9, les constructeurs de classe correspondant aux types primitifs sont marqués comme obsolètes.
L'histoire de l'écriture de Java dans Emacs
Revue des connaissances «étranges Java» et Java souvent oubliées dans Java Bronze
[Rails] Mise en œuvre de la validation qui maintient l'unicité
[Java] Implémenter une fonction qui utilise une classe implémentée dans le modèle Builder
Code pour supprimer tous les fichiers du préfixe spécifié dans AWS S3 (Java)
La cause n'est pas visible lors de l'appel de méthodes d'autres classes en java
[Java] Calculer le jour à partir de la date (ne pas utiliser la classe Calendar)
Correspondance de la partie où l'authentification # getDetails est effectuée dans le test unitaire de spring-security
[Java] Gestion des Java Beans dans la chaîne de méthodes
L'histoire de la fabrication d'un Othello ordinaire à Java
À propos de l'idée des classes anonymes en Java
L'ordre des modificateurs de méthode Java est fixe
Mesurer la taille d'un dossier avec Java
Ressentez le passage du temps même à Java
Un examen rapide de Java appris en classe
[Java] Quelque chose est affiché comme "-0.0" dans la sortie
Importer des fichiers de la même hiérarchie en Java
Classe StringConverter à usage général qui utilise des génériques dans Java8
Première touche de la classe Files (ou Java 8)
[Ruby on Rails] Implémentation de la validation qui ne fonctionne que lorsque les conditions sont remplies
Comment obtenir le nom de classe de l'argument de LoggerFactory.getLogger lors de l'utilisation de SLF4J en Java
Java Méthode à usage général qui récupère uniquement les différences entre les propriétés des objets de la même classe
Principes de base de la gestion des erreurs Java - L'histoire qui capture n'est prise qu'au premier plan
Obtenez l'URL de la destination de la redirection HTTP en Java
Dans Time.strptime,% j (date totale de l'année) est
Un examen rapide de Java appris en classe part4
La comparaison d'énumération est ==, et equals est bonne [Java]
Ecrire une classe qui peut être ordonnée en Java Un petit mémo standard
Obtenez le nom du scénario de test dans la classe de test JUnit
Quel est le meilleur, Kotlin ou futur Java?
Parcourir les objets de classe dans Kotlin (au lieu de Java class name.class)
[Java] Récupère le fichier dans le fichier jar quel que soit l'environnement