Forår MVC indholdsforhandling

1. Oversigt

Denne artikel beskriver, hvordan man implementerer indholdsforhandling i et Spring MVC-projekt.

Generelt er der tre muligheder for at bestemme medietypen for en anmodning:

  • Brug af URL-suffikser (udvidelser) i anmodningen (f.eks .xml / .json)
  • Brug af URL-parameter i anmodningen (f.eks ? format = json)
  • Ved brug af Acceptere header i anmodningen

Som standard er dette den rækkefølge, som Spring Content-forhandlingschef vil forsøge at bruge disse tre strategier. Og hvis ingen af ​​disse er aktiveret, kan vi angive en reserve til en standardindholdstype.

2. Indholdsforhandlingsstrategier

Lad os starte med de nødvendige afhængigheder - vi arbejder med JSON- og XML-repræsentationer, så i denne artikel bruger vi Jackson til JSON:

 com.fasterxml.jackson.core jackson-core 2.10.2 com.fasterxml.jackson.core jackson-databind 2.10.2 

Til XML-support kan vi bruge enten JAXB, XStream eller den nyere Jackson-XML-support.

Da vi har forklaret brugen af Acceptere header i en tidligere artikel om HttpMessageConverters, lad os fokusere på de to første strategier i dybden.

3. URL-suffiksstrategien

Som standard er denne strategi deaktiveret, men rammen kan kontrollere en stiudvidelse lige fra URL'en for at bestemme outputindholdstypen.

Før vi går i konfigurationer, lad os se hurtigt på et eksempel. Vi har følgende enkle API-metodeimplementering i en typisk Spring-controller:

@RequestMapping (værdi = "/ medarbejder / {id}", producerer = {"applikation / json", "applikation / xml"}, metode = RequestMethod.GET) offentlig @ResponseBody Medarbejder getEmployeeById (@PathVariable lang id) {return medarbejderKort .get (id); } 

Lad os påkalde det ved hjælp af JSON-udvidelsen til at specificere medietypen for ressourcen:

krølle //localhost:8080/spring-mvc-basics/employee/10.json

Her er hvad vi kan få tilbage, hvis vi bruger en JSON-udvidelse:

{"id": 10, "name": "Testmedarbejder", "contactNumber": "999-999-9999"}

Og her er hvordan anmodning-svaret vil se ud med XML:

krølle //localhost:8080/spring-mvc-basics/employee/10.xml

Svarorganet:

 999-999-9999 10 Testmedarbejder 

Nu, hvis vi ikke bruger nogen udvidelse eller brug en, der ikke er konfigureret, returneres standardindholdstypen:

curl // localhost: 8080 / spring-mvc-basics / medarbejder / 10

Lad os nu se på opsætning af denne strategi - med både Java- og XML-konfigurationer.

3.1. Java-konfiguration

public void configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (false). ignoreAcceptHeader (sand). useJaf (false). defaultContentType (MediaType.APPLICATION_JSON); }

Lad os gå gennem detaljerne.

For det første aktiverer vi strategien for stiudvidelser. Det er også værd at nævne, at fra og med Spring Framework 5.2.4 favorPathExtension (boolsk) metoden er udfaset for at modvirke brugen af ​​stiudvidelser til indholdsforhandlinger.

Derefter deaktiverer vi såvel URL-parameterstrategien som Acceptere headerstrategi - fordi vi kun vil stole på stienudvidelsesmåden til at bestemme typen af ​​indholdet.

Vi slukker derefter Java Activation Framework; JAF kan bruges som en reservemekanisme til at vælge outputformatet, hvis den indgående anmodning ikke matcher nogen af ​​de strategier, vi har konfigureret. Vi deaktiverer det, fordi vi skal konfigurere JSON som standardindholdstype. Bemærk, at det useJaf () metoden er udfaset fra Spring Framework 5.

Og endelig - vi indstiller JSON til at være standard. Det betyder, at hvis ingen af ​​de to strategier matches, vil alle indgående anmodninger blive kortlagt til en controller-metode, der tjener JSON.

3.2. XML-konfiguration

Lad os også se hurtigt på den samme nøjagtige konfiguration, kun ved hjælp af XML:

4. URL-parameterstrategien

Vi har brugt stiudvidelser i det foregående afsnit - lad os nu oprette Spring MVC til at bruge en stiparameter.

Vi kan aktivere denne strategi ved at indstille værdien af favor Parameter ejendom til sand.

Lad os se hurtigt på, hvordan det fungerer med vores tidligere eksempel:

curl // localhost: 8080 / spring-mvc-basics / medarbejder / 10? mediaType = json

Og her er hvad JSON-responsorganet vil være:

{"id": 10, "name": "Testmedarbejder", "contactNumber": "999-999-9999"}

Hvis vi bruger XML-parameteren, vil output være i XML-form:

curl // localhost: 8080 / spring-mvc-basics / medarbejder / 10? mediaType = xml

Svarorganet:

 999-999-9999 10 Testmedarbejder 

Lad os nu konfigurere - igen, først ved hjælp af Java og derefter XML.

4.1. Java-konfiguration

public void configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (false). favorParameter (sand). parameternavn ("mediaType"). ignoreAcceptHeader (sand). useJaf (false). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); } 

Lad os læse denne konfiguration igennem.

Først selvfølgelig stiudvidelsen og Acceptere headerstrategier er deaktiveret (såvel som JAF).

Resten af ​​konfigurationen er den samme.

4.2. XML-konfiguration

Vi kan også have begge strategier (udvidelse og parameter) aktiveret på samme tid:

public void configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (sand). parameternavn ("mediaType"). ignoreAcceptHeader (sand). useJaf (false). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); }

I dette tilfælde vil Spring først søge efter stiudvidelse, hvis den ikke er til stede, vil den lede efter sti-parameter. Og hvis begge disse ikke er tilgængelige i inputanmodningen, returneres standardindholdstypen.

5. Den Acceptere Sidehovedstrategi

Hvis den Acceptere header er aktiveret, vil Spring MVC se efter sin værdi i den indgående anmodning for at bestemme repræsentationstypen.

Vi er nødt til at indstille værdien af ignorereAcceptHeader at falsk for at muliggøre denne tilgang, og vi deaktiverer de to andre strategier bare så vi ved, at vi kun stoler på Acceptere header.

5.1. Java-konfiguration

public void configureContentNegotiation (ContentNegotiationConfigurer configurer) {configurer.favorPathExtension (true). favorParameter (false). parameternavn ("mediaType"). ignoreAcceptHeader (false). useJaf (false). defaultContentType (MediaType.APPLICATION_JSON). mediaType ("xml", MediaType.APPLICATION_XML). mediaType ("json", MediaType.APPLICATION_JSON); }

5.2. XML-konfiguration

Endelig er vi nødt til at tænde for indholdsforhandlingsadministratoren ved at sætte den i den overordnede konfiguration:

6. Konklusion

Og vi er færdige. Vi kiggede på, hvordan indholdsforhandling fungerer i Spring MVC, og vi fokuserede på et par eksempler på opsætning af det til at bruge forskellige strategier til at bestemme indholdstypen.

Den fulde implementering af denne artikel kan findes på GitHub.


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