Spring @Pathvariable Annotation

1. Oversigt

I denne hurtige vejledning udforsker vi forårets @PathVariable kommentar.

Kort fortalt, det @PathVariable annotering kan bruges til at håndtere skabelonvariabler i URI-kortlægningen, og brug dem som metodeparametre.

Lad os se, hvordan man bruger @PathVariable og dens forskellige egenskaber.

2. En simpel kortlægning

En simpel brugstilfælde af @PathVariable kommentar ville være et slutpunkt, der identificerer en enhed med en primær nøgle:

@GetMapping ("/ api / ansatte / {id}") @ResponseBody offentlig streng getEmployeesById (@PathVariable streng-id) {return "ID:" + id; }

I dette eksempel bruger vi @PathVariable kommentar for at udtrække den skabelonede del af URI repræsenteret af variablen {id}.

En simpel FÅ anmodning til / api / medarbejdere / {id} vil påberåbe sig getEmployeesById med den ekstraherede id-værdi:

// localhost: 8080 / api / ansatte / 111 ---- ID: 111

Lad os nu undersøge denne kommentar yderligere og se på dens egenskaber.

3. Angivelse af sti-variabelnavn

I det forrige eksempel sprang vi over at definere navnet på skabelonens sti-variabel, da navnene på metodeparameteren og sti-variablen var de samme.

Men hvis stivariabelnavnet er forskelligt, kan vi specificere det i argumentet for @PathVariable kommentar:

@GetMapping ("/ api / workerswithvariable / {id}") @ResponseBody public String getEmployeesByIdWithVariableName (@PathVariable ("id") Streng medarbejder-id) {return "ID:" + medarbejder-id; }
// localhost: 8080 / api / workerswithvariable / 1 ---- ID: 1

Vi kan også definere sti-variabelnavnet som @PathVariable (værdi = ”id”) i stedet for PathVariable (“id”) for klarhed.

4. Flere sti-variabler i en enkelt anmodning

Afhængigt af brugen vi kan have mere end en stivariabel i vores anmodning URI om en controller-metode, som også har flere metodeparametre:

@GetMapping ("/ api / workers / {id} / {name}") @ResponseBody public String getEmployeesByIdAndName (@PathVariable String id, @PathVariable String name) {return "ID:" + id + ", name:" + name ; }
// localhost: 8080 / api / medarbejdere / 1 / bar ---- ID: 1, navn: bar

Vi kan også håndtere mere end en @PathVariable parametre ved hjælp af en metodeparameter af typen java.util.Map:

@GetMapping ("/ api / workerswithmapvariable / {id} / {name}") @ResponseBody public String getEmployeesByIdAndNameWithMapVariable (@PathVariable Map pathVarsMap) {String id = pathVarsMap.get ("id"); Strengnavn = pathVarsMap.get ("navn"); hvis (id! = null && navn! = null) {returner "ID:" + id + ", navn:" + navn; } andet {returner "Manglende parametre"; }}
// localhost: 8080 / api / ansatte / 1 / bar ---- ID: 1, navn: bar

Der er dog en lille fangst under håndtering af flere @PathVariable parametre, når stienvariabelstrengen indeholder et priktegn (.). Vi har diskuteret disse hjørnesager i detaljer her.

5. Valgfri stivariabler

I foråret kommenteres metodeparametre med @PathVariable kræves som standard:

@GetMapping (værdi = {"/ api / workerswithrequired", "/ api / workerswithrequired / {id}"}) @ResponseBody public String getEmployeesByIdWithRequired (@PathVariable String id) {return "ID:" + id; }

Af hvordan det ser ud, skal ovenstående controller håndtere begge dele / api / medarbejdere uden behov og / api / medarbejdere uden behov / 1 anmodningsstier. Men da metodeparametre kommenteres af @PathVariables er obligatoriske som standard, det håndterer ikke de anmodninger, der sendes til / api / medarbejdere uden behov sti:

// localhost: 8080 / api / workerswithrequired ---- {"timestamp": "2020-07-08T02: 20: 07.349 + 00: 00", "status": 404, "error": "Not Found", " meddelelse ":" "," path ":" / api / workerswithrequired "}  // localhost: 8080 / api / medarbejdere uden behov / 1 ---- ID: 111

Vi kan håndtere dette på to måder.

5.1. Indstilling @PathVariable som ikke krævet

Vi kan indstille krævet ejendom af @PathVariable til falsk for at gøre det valgfrit. Derfor ændrer vi vores tidligere eksempel nu URI-versionerne med og uden stivariablen:

@GetMapping (værdi = {"/ api / workerswithrequiredfalse", "/ api / workerswithrequiredfalse / {id}"}) @ResponseBody public String getEmployeesByIdWithRequiredFalse (@PathVariable (required = false) String id) {if (id! = Null) { returner "ID:" + id; } andet {returner "ID mangler"; }}
// localhost: 8080 / api / workerswithrequiredfalse ---- ID mangler

5.2. Ved brug af java.util. Valgfrit

Siden foråret 4.1 kan vi også bruge java.util. Valgfrit (tilgængelig i Java 8+) til at håndtere en ikke-obligatorisk stivariabel:

@GetMapping (værdi = {"/ api / workerswithoptional", "/ api / workerswithoptional / {id}"}) @ResponseBody public String getEmployeesByIdWithOptional (@PathVariable Optional id) {if (id.isPresent ()) {return "ID: "+ id.get (); } andet {return "ID mangler"; }}

Nu, hvis vi ikke angiver stivariablen id i anmodningen får vi standardsvaret:

// localhost: 8080 / api / workerswithoptional ---- ID mangler 

5.3. Brug af en metodeparameter af typen Kort

Som vist tidligere kan vi bruge en enkelt metodeparameter af typen java.util.Kort til at håndtere alle stivariabler i anmodnings-URI. Vi kan også bruge denne strategi til at håndtere den valgfri stavevariabel:

@GetMapping (værdi = {"/ api / workerswithmap / {id}", "/ api / workerswithmap"}) @ResponseBody public String getEmployeesByIdWithMap (@PathVariable Map pathVarsMap) {String id = pathVarsMap.get ("id"); hvis (id! = null) {returner "ID:" + id; } andet {return "ID mangler"; }}

6. Standardværdi for @PathVariable

Uden for boksen er der ikke en bestemmelse, der definerer en standardværdi for metodeparametre, der er kommenteret med @PathVariable. Vi kan dog bruge de samme strategier, der er diskuteret ovenfor, for at tilfredsstille standardværdien for @PathVariable. Vi skal bare se efter nul på sti-variablen.

For eksempel ved hjælp af java.util. Valgfrit, kan vi identificere, om stivariablen er nul eller ikke. Hvis det er nul så kan vi bare svare på anmodningen med en standardværdi:

@GetMapping (værdi = {"/ api / defaultemployeeswithoptional", "/ api / defaultemployeeswithoptional / {id}"}) @ResponseBody public String getDefaultEmployeesByIdWithOptional (@PathVariable Optional id) {if (id.isPresent ()) {return "ID: "+ id.get (); } ellers {return "ID: Standardmedarbejder"; }}

7. Konklusion

I denne artikel diskuterede vi, hvordan du bruger Spring's @PathVariable kommentar. Vi identificerede også de forskellige måder til effektiv anvendelse af @PathVariable kommentar, der passer til forskellige brugssager, såsom valgfri parametre og håndtering af standardværdier.

Kodeeksemplet vist i denne artikel er også tilgængeligt på Github.