Basisprincipes van Java Bean-validatie

1. Overzicht

In deze korte tutorial behandelen we de basisprincipes van het valideren van een Java-bean met het standaard framework - JSR 380, ook wel bekend als Bean Validatie 2.0.

Het valideren van gebruikersinvoer is een veel voorkomende vereiste in de meeste toepassingen. En het Java Bean Validation-framework is de de facto standaard geworden voor het omgaan met dit soort logica.

2. JSR 380

JSR 380 is een specificatie van de Java API voor bean-validatie, onderdeel van Jakarta EE en JavaSE. Dit zorgt ervoor dat de eigenschappen van een boon voldoen aan specifieke criteria, met behulp van annotaties zoals @Niet nul, @Min, en @Max.

Deze versie vereist Java 8 of hoger en maakt gebruik van nieuwe functies die in Java 8 zijn toegevoegd, zoals type-annotaties en ondersteuning voor nieuwe typen zoals Optioneel en LocalDate.

Lees de JSR 380 voor volledige informatie over de specificaties.

3. Afhankelijkheden

We gaan een Maven-voorbeeld gebruiken om de vereiste afhankelijkheden te laten zien. Maar deze potjes kunnen natuurlijk op verschillende manieren worden toegevoegd.

3.1. Validatie-API

Volgens de JSR 380-specificatie is de validatie-api afhankelijkheid bevat de standaard validatie-API's:

 javax.validation validation-api 2.0.1.Final 

3.2. Validatie API-referentie-implementatie

Hibernate Validator is de referentie-implementatie van de validatie-API.

Om het te gebruiken, moeten we de volgende afhankelijkheid toevoegen:

 org.hibernate.validator slaapstand-validator 6.0.13.Final 

Een korte opmerking: slaapstand-validator staat volledig los van de persistentieaspecten van Hibernate. Dus door het toe te voegen als een afhankelijkheid, voegen we deze persistentieaspecten niet toe aan het project.

3.3. Expressie taalafhankelijkheden

JSR 380 ondersteunt variabele interpolatie, waardoor expressies binnen de overtredingsberichten mogelijk zijn.

Om deze uitdrukkingen te ontleden, voegen we de javax.el afhankelijkheid van GlassFish, die een implementatie van de Expression Language-specificatie bevat:

 org.glassfish javax.el 3.0.0 

4. Validatie-aantekeningen gebruiken

Hier nemen we een Gebruiker bean en werk eraan om er wat eenvoudige validatie aan toe te voegen:

importeer javax.validation.constraints.AssertTrue; importeer javax.validation.constraints.Max; importeer javax.validation.constraints.Min; importeer javax.validation.constraints.NotNull; importeer javax.validation.constraints.Size; javax.validation.constraints.Email importeren; openbare klasse Gebruiker {@NotNull (bericht = "Naam mag niet null zijn") privé Stringnaam; @AssertTrue privé booleaanse werking; @Size (min = 10, max = 200, message = "Over mij moet tussen 10 en 200 tekens lang zijn") private String aboutMe; @Min (waarde = 18, message = "Leeftijd mag niet lager zijn dan 18") @Max (waarde = 150, message = "Leeftijd mag niet hoger zijn dan 150") private int leeftijd; @Email (message = "E-mail moet geldig zijn") private String e-mail; // standaard setters en getters} 

Alle annotaties die in het voorbeeld worden gebruikt, zijn standaard JSR-annotaties:

  • @Niet nul valideert dat de geannoteerde eigenschapswaarde dat niet is nul.
  • @AssertTrue valideert dat de geannoteerde eigenschapswaarde waar.
  • @Grootte valideert dat de geannoteerde eigenschapswaarde een grootte heeft tussen de attributen min en max. hoogte; kan worden toegepast op Draad, Verzameling, Kaart, en array-eigenschappen.
  • @Min valideert dat de geannoteerde eigenschap een waarde heeft die niet kleiner is dan de waarde attribuut.
  • @Max valideert dat de geannoteerde eigenschap een waarde heeft die niet groter is dan de waarde attribuut.
  • @E-mail valideert dat de geannoteerde eigenschap een geldig e-mailadres is.

Sommige annotaties accepteren aanvullende attributen, maar de bericht attribuut is gemeenschappelijk voor alle. Dit is het bericht dat gewoonlijk wordt weergegeven als de waarde van de respectieve eigenschap niet kan worden gevalideerd.

En enkele aanvullende annotaties die te vinden zijn in de JSR:

  • @Niet leeg valideert dat de eigenschap niet null of leeg is; kan worden toegepast op Draad, Verzameling, Kaart of Array waarden.
  • @RTLnieuws kan alleen worden toegepast op tekstwaarden en valideert dat de eigenschap niet null of witruimte is.
  • @Positief en @PositiveOrZero zijn van toepassing op numerieke waarden en valideren dat ze strikt positief zijn, of positief inclusief 0.
  • @Negatief en @NegativeOrZero zijn van toepassing op numerieke waarden en valideren dat ze strikt negatief zijn, of negatief inclusief 0.
  • @Verleden en @BuienRadarNL valideren dat een datumwaarde in het verleden of het verleden ligt, inclusief het heden; kan worden toegepast op datumtypen, inclusief die welke zijn toegevoegd in Java 8.
  • @Toekomst en @FutureOrPresent valideren dat een datumwaarde in de toekomst ligt, of in de toekomst inclusief het heden.

De validatie-annotaties kunnen ook worden toegepast op elementen van een collectie:

Lijstvoorkeuren;

In dat geval wordt elke toegevoegde waarde aan de lijst met voorkeuren gevalideerd.

Ook de specificatie ondersteunt het nieuwe Optioneel type in Java 8:

privé LocalDate dateOfBirth; openbaar Optioneel getDateOfBirth () {return Optioneel.of (dateOfBirth); }

Hier zal het validatieframework het LocalDate waarde en valideer het.

5. Programmatische validatie

Sommige frameworks - zoals Spring - hebben eenvoudige manieren om het validatieproces te activeren door alleen annotaties te gebruiken. Dit is voornamelijk bedoeld om te voorkomen dat we hoeven te communiceren met de programmatische validatie-API.

Laten we nu de handmatige route volgen en dingen programmatisch instellen:

ValidatorFactory factory = Validation.buildDefaultValidatorFactory (); Validator validator = factory.getValidator (); 

Om een ​​boon te valideren, hebben we eerst een Validator object, dat is gebouwd met behulp van een ValidatorFactory.

5.1. De boon definiëren

We gaan deze ongeldige gebruiker nu instellen - met een null naam waarde:

Gebruiker gebruiker = nieuwe gebruiker (); user.setWorking (true); user.setAboutMe ("Het draait allemaal om mij!"); user.setAge (50); 

5.2. Valideer de boon

Nu we een Validatorkunnen we onze boon valideren door deze door te geven aan de valideren methode.

Elke schending van de beperkingen die zijn gedefinieerd in het Gebruiker object wordt geretourneerd als een Set:

Set violations = validator.validate (gebruiker); 

Door de schendingen te herhalen, kunnen we alle schendingsberichten krijgen met behulp van de getMessage methode:

voor (ConstraintViolation-schending: overtredingen) {log.error (schending.getMessage ()); } 

In ons voorbeeld (ifNameIsNull_nameValidationFails), zou de set een enkele bevatten Beperking van overtreding met het bericht "Naam mag niet null zijn".

6. Conclusie

Dit artikel was gericht op het eenvoudig doorlopen van de standaard Java Validation API. We hebben de basisprincipes van bonenvalidatie laten zien met behulp van javax.validation annotaties en API's.

Zoals gewoonlijk is een implementatie van de concepten in dit artikel en alle codefragmenten te vinden op GitHub.