Forskjeller i @Valid og @Validated Annotations in Spring

1. Oversikt

I denne raske opplæringen vil vi fokusere på forskjellene mellom @Gyldig og @Validert merknader om våren.

Validering av brukernes innspill er en vanlig funksjonalitet i de fleste av våre applikasjoner. I Java Ecosystem bruker vi spesifikt Java Standard Bean Validation API for å støtte dette. Dessuten er dette også godt integrert med Spring fra versjon 4.0 og utover. De @Gyldig og @Validert merknader stammer fra denne Standard Bean API.

I de neste avsnittene, la oss se på dem i detalj.

2. @Gyldig og @Validert Kommentarer

På våren bruker vi JSR-303 @Gyldig kommentar for validering av metodenivå. Videre bruker vi den også til å markere et medlemsattributt for validering. Denne merknaden støtter imidlertid ikke gruppevalidering.

Grupper hjelper til med å begrense begrensningene som brukes under validering. En spesiell brukssak er UI-veivisere. Her, i det første trinnet, kan vi ha en bestemt undergruppe av felt. I det påfølgende trinnet kan det være en annen gruppe som tilhører samme bønne. Derfor må vi bruke begrensninger på disse begrensede feltene i hvert trinn, men @Gyldig støtter ikke dette.

I dette tilfellet, for gruppenivå må vi bruke vårens @Validert, som er en variant av denne JSR-303 @Gyldig. Dette brukes på metodenivå. Og for å markere medlemsattributter fortsetter vi å bruke @Gyldig kommentar.

La oss nå dykke inn og se på bruken av disse kommentarene med et eksempel.

3. Eksempel

La oss vurdere et enkelt brukerregistreringsskjema utviklet ved hjelp av Spring Boot. Til å begynne med har vi bare Navn og passord attributter:

offentlig klasse UserAccount {@NotNull @Size (min = 4, max = 15) privat strengpassord; @NotBlank private strengnavn; // standard konstruktører / settere / getters / toString} 

Deretter, la oss se på kontrolleren. Her skal vi ha saveBasicInfo metoden med @Gyldig kommentar for å validere brukerinngangen:

@RequestMapping (value = "/ saveBasicInfo", method = RequestMethod.POST) public String saveBasicInfo (@Valid @ModelAttribute ("useraccount") UserAccount useraccount, BindingResult result, ModelMap model) {if (result.hasErrors ()) {return " feil"; } returner "suksess"; }

La oss nå teste denne metoden:

@Test offentlig ugyldig givenSaveBasicInfo_whenCorrectInput_thenSuccess () kaster unntak {this.mockMvc.perform (MockMvcRequestBuilders.post ("/ saveBasicInfo") .accept (MediaType.TEXT_HTML) .param ("name", "test123"). "pass")). ogExpect (view (). name ("success")). andExpect (status (). isOk ()). andDo (print ()); }

Etter å ha bekreftet at testen kjører vellykket, la oss nå utvide funksjonaliteten. Det neste logiske trinnet er å konvertere dette til et registreringsskjema i flere trinn, slik det er tilfellet med de fleste veivisere. Det første trinnet med Navn og passord forblir uendret. I det andre trinnet henter vi ytterligere informasjon som alder og telefonen. Derfor oppdaterer vi domeneobjektet vårt med disse tilleggsfeltene:

offentlig klasse UserAccount {@NotNull @Size (min = 4, max = 15) privat strengpassord; @NotBlank private strengnavn; @Min (verdi = 18, melding = "Alder skal ikke være mindre enn 18") privat alder; @NotBlank privat strengtelefon; // standard konstruktører / settere / getters / toString} 

Denne gangen vil vi imidlertid merke at den forrige testen mislykkes. Dette er fordi vi ikke passerer i alder og telefonen felt, som fremdeles ikke er på bildet i brukergrensesnittet. For å støtte denne oppføringen trenger vi gruppevalidering og @Validert kommentar.

For dette må vi gruppere feltene og skape to forskjellige grupper. Først må vi lage to markørgrensesnitt. En egen for hver gruppe eller hvert trinn. Vi kan se på artikkelen vår om gruppevalidering for den nøyaktige implementeringen av dette. La oss fokusere på forskjellene i kommentarene.

Vi får Grunnleggende informasjon grensesnitt for første trinn og AdvanceInfo for andre trinn. Videre oppdaterer vi vår Brukerkonto klasse for å bruke disse markørgrensesnittene som følger:

offentlig klasse UserAccount {@NotNull (grupper = BasicInfo.class) @Size (min = 4, max = 15, grupper = BasicInfo.class) private strengpassord; @NotBlank (grupper = BasicInfo.class) privat strengnavn; @Min (verdi = 18, melding = "Alder skal ikke være mindre enn 18", grupper = AdvanceInfo.class) privat alder; @NotBlank (grupper = AdvanceInfo.class) privat strengtelefon; // standard konstruktører / settere / getters / toString} 

I tillegg oppdaterer vi nå kontrolleren vår for å bruke @Validert kommentar i stedet for @Gyldig:

@RequestMapping (verdi = "/ saveBasicInfoStep1", metode = RequestMethod.POST) offentlig streng saveBasicInfoStep1 (@Validated (BasicInfo.class) @ModelAttribute ("useraccount") UserAccount useraccount, BindingResult result, ModelMap modelas {) )) {return "feil"; } returner "suksess"; }

Som et resultat av denne oppdateringen kjører testen vår nå. La oss også teste denne nye metoden:

@Test offentlig ugyldighet gittSaveBasicInfoStep1_whenCorrectInput_thenSuccess () kaster unntak {this.mockMvc.perform (MockMvcRequestBuilders.post ("/ saveBasicInfoStep1") .accept (MediaType.TEXT_HTML) .param ("navn" "pass")). ogExpect (view (). name ("success")). andExpect (status (). isOk ()). andDo (print ()); }

Også dette kjører vellykket. Derfor kan vi se hvordan bruken av @Validert er viktig for gruppevalidering.

La oss se hvordan @Gyldig er viktig for å utløse validering av nestede attributter.

4. Bruke @Gyldig Kommentar for å merke nestede objekter

De @Gyldig kommentar brukes spesielt til å merke nestede attributter. Dette utløser validering av det nestede objektet. For eksempel, i vårt nåværende scenario, la oss lage en UserAddress gjenstand:

offentlig klasse UserAddress {@NotBlank private String countryCode; // standard konstruktører / settere / getters / toString}

For å sikre validering av dette nestede objektet, dekorerer vi attributtet med @Gyldig kommentar:

offentlig klasse UserAccount {// ... @Valid @NotNull (grupper = AdvanceInfo.class) privat UserAddress brukeradresse; // standard konstruktører / settere / getters / toString}

5. Fordeler og ulemper

La oss se på noen av fordelene og ulempene ved å bruke @Gyldig og @Validert merknader om våren.

De @Gyldig kommentar sikrer validering av hele objektet. Det er viktig at den utfører validering av hele objektgrafene. Dette skaper imidlertid problemer for scenarier som bare trenger delvis validering.

På den annen side kan vi bruke @Validert for gruppevalidering, inkludert ovennevnte delvise validering. Imidlertid må de validerte enhetene i dette tilfellet kjenne valideringsreglene for alle gruppene eller brukssakene det brukes i. Her blander vi bekymringer, og dette kan resultere i et antimønster.

6. Konklusjon

I denne raske opplæringen undersøkte vi de viktigste forskjellene mellom @Gyldig og @Validert Kommentarer.

For å konkludere, for enhver grunnleggende validering, bruker vi JSR @Gyldig kommentar i metoden vår. På den annen side, for enhver gruppevalidering, inkludert gruppesekvenser, må vi bruke Spring's @Validert kommentar i vår metodeanrop. De @Gyldig merknad er også nødvendig for å utløse validering av nestede egenskaper.

Som alltid er koden presentert i denne artikkelen tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found