Spring @RequestMapping New Shortcut Annotations

1. Oversikt

Vår 4.3. introduserte noen veldig kule komponerte merknader på metodenivå for å jevne ut håndteringen @RequestMapping i typiske Spring MVC-prosjekter.

I denne artikkelen vil vi lære hvordan du bruker dem på en effektiv måte.

2. Nye merknader

Vanligvis hvis vi ønsker å implementere URL-behandleren ved hjelp av tradisjonell @RequestMapping kommentar, det ville ha vært noe sånt:

@RequestMapping (verdi = "/ get / {id}", metode = RequestMethod.GET)

Den nye tilnærmingen gjør det mulig å forkorte dette ganske enkelt til:

@GetMapping ("/ get / {id}")

Spring støtter for tiden fem typer innebygde merknader for å håndtere forskjellige typer innkommende HTTP-forespørselsmetoder som er FÅ, POST, PUT, SLETT og LAPP. Disse kommentarene er:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

Fra navnekonvensjonen kan vi se at hver kommentar er ment å håndtere respektive innkommende forespørselmetodetype, dvs. @GetMapping brukes til å håndtere type forespørselsmetode, @PostMapping brukes til å håndtere POST type forespørselsmetode osv.

3. Hvordan det fungerer

Alle kommentarene ovenfor er allerede kommentert internt med @RequestMapping og den respektive verdien i metode element.

For eksempel hvis vi ser på kildekoden til @GetMapping kommentar, kan vi se at den allerede er kommentert med RequestMethod.GET på følgende måte:

@Target ({java.lang.annotation.ElementType.METHOD}) @Retention (RetentionPolicy.RUNTIME) @Documented @RequestMapping (method = {RequestMethod.GET}) public @interface GetMapping {// abstrakte koder}

Alle de andre kommentarene er opprettet på samme måte, dvs. @PostMapping er kommentert med RequestMethod.POST, @PutMapping er kommentert med RequestMethod.PUT, etc.

Den fullstendige kildekoden til merknadene er tilgjengelig her.

4. Gjennomføring

La oss prøve å bruke disse kommentarene til å bygge en rask REST-applikasjon.

Vær oppmerksom på at siden vi bruker Maven til å bygge prosjektet og Spring MVC for å lage vår applikasjon, må vi legge til nødvendige avhengigheter i pom.xml:

 org.springframework spring-webmvc 5.2.2.RELEASE 

Den siste versjonen av vår-webmvc er tilgjengelig i Central Maven Repository.

Nå må vi opprette kontrolleren for å tilordne URL for innkommende forespørsel. Inne i denne kontrolleren vil vi bruke alle disse kommentarene en etter en.

4.1. @GetMapping

@GetMapping ("/ get") offentlig @ResponseBody ResponseEntity get () {return new ResponseEntity ("GET Response", HttpStatus.OK); } 
@GetMapping ("/ get / {id}") public @ResponseBody ResponseEntity getById (@PathVariable String id) {return new ResponseEntity ("GET Response:" + id, HttpStatus.OK); }

4.2. @PostMapping

@PostMapping ("/ post") public @ResponseBody ResponseEntity post () {return new ResponseEntity ("POST Response", HttpStatus.OK); }

4.3. @PutMapping

@PutMapping ("/ put") public @ResponseBody ResponseEntity put () {return new ResponseEntity ("PUT Response", HttpStatus.OK); }

4.4. @DeleteMapping

@DeleteMapping ("/ delete") public @ResponseBody ResponseEntity delete () {return new ResponseEntity ("DELETE Response", HttpStatus.OK); }

4.5. @PatchMapping

@PatchMapping ("/ patch") offentlig @ResponseBody ResponseEntity patch () {return new ResponseEntity ("PATCH Response", HttpStatus.OK); }

Poeng å merke seg:

  • Vi har brukt de nødvendige kommentarene for å håndtere riktige innkommende HTTP-metoder med URI. For eksempel, @GetMapping å håndtere “/ få” URI, @PostMapping å håndtere “/ post” URI og så videre

  • Siden vi lager et REST-basert program, returnerer vi en konstant streng (unik for hver forespørselstype) med 200 responskode for å forenkle applikasjonen. Vi har brukt vårens @ResponseBody kommentar i dette tilfellet.
  • Hvis vi måtte håndtere en URL-variabel, kan vi ganske enkelt gjøre det på mye mindre måte vi pleide å gjøre i tilfelle vi brukte det @RequestMapping.

5. Testing av applikasjonen

For å teste applikasjonen må vi opprette et par testsaker ved hjelp av JUnit. Vi ville brukt SpringJUnit4ClassRunner å starte testklassen. Vi ville lage fem forskjellige testtilfeller for å teste hver kommentar og hver behandler vi erklærte i kontrolleren.

La oss enkelt eksemplet test tilfelle av @GetMapping:

@Test public void giventUrl_whenGetRequest_thenFindGetResponse () kaster unntak {MockHttpServletRequestBuilder builder = MockMvcRequestBuilders .get ("/ get"); ResultMatcher contentMatcher = MockMvcResultMatchers.content () .streng ("GET Response"); this.mockMvc.perform (builder) .andExpect (contentMatcher) .andExpect (MockMvcResultMatchers.status (). isOk ()); }

Som vi ser, forventer vi en konstant streng “FÅ svar“, Når vi først traff URL “/ get”.

La oss nå lage testsaken for å teste @PostMapping:

@Test offentlig ugyldig givenUrl_whenPostRequest_thenFindPostResponse () kaster unntak {MockHttpServletRequestBuilder builder = MockMvcRequestBuilders .post ("/ post"); ResultMatcher contentMatcher = MockMvcResultMatchers.content () .streng ("POST-svar"); this.mockMvc.perform (builder) .andExpect (contentMatcher) .andExpect (MockMvcResultMatchers.status (). isOk ()); }

På samme måte opprettet vi resten av testtilfellene for å teste alle HTTP-metodene.

Alternativt kan vi alltid bruke en hvilken som helst vanlig REST-klient, for eksempel PostMan, RESTClient etc, for å teste applikasjonen vår. I så fall må vi være litt forsiktige med å velge riktig HTTP-metodetype mens vi bruker resten-klienten. Ellers ville det kaste 405 feilstatus.

6. Konklusjon

I denne artikkelen hadde vi en rask introduksjon til de forskjellige typene @RequestMapping snarveier for rask webutvikling ved bruk av tradisjonelle Spring MVC-rammeverk. Vi kan bruke disse raske snarveiene til å skape en ren kodebase.

Som alltid kan du finne kildekoden for denne opplæringen i Github-prosjektet.