Jarné rokovanie o obsahu MVC

1. Prehľad

Tento článok popisuje, ako implementovať vyjednávanie o obsahu v projekte Spring MVC.

Spravidla existujú tri možnosti, ako určiť typ média požiadavky:

  • Používanie prípon (rozšírení) URL v požiadavke (napr .xml / .json)
  • Použitie parametra URL v žiadosti (napr ? format = json)
  • Použitím súhlasiť hlavičku v žiadosti

Predvolene je to poradie, v ktorom sa manažér jarného vyjednávania obsahu bude snažiť použiť tieto tri stratégie. A ak nie je povolené žiadne z nich, môžeme určiť alternatívu k predvolenému typu obsahu.

2. Stratégie vyjednávania o obsahu

Začnime s potrebnými závislosťami - pracujeme s reprezentáciami JSON a XML, takže pre tento článok použijeme Jackson pre JSON:

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

Na podporu XML môžeme použiť buď JAXB, XStream, alebo novšiu podporu Jackson-XML.

Pretože sme vysvetlili použitie súhlasiť hlavička v predchádzajúcom článku o HttpMessageConverters, zamerajme sa do hĺbky na prvé dve stratégie.

3. Stratégia prípony URL

V predvolenom nastavení je táto stratégia zakázaná, ale rámec môže skontrolovať rozšírenie cesty priamo z adresy URL a určiť typ výstupného obsahu.

Pred prechodom na konfigurácie sa pozrime na krátky príklad. V typickom regulátore Spring máme nasledujúcu jednoduchú implementáciu metódy API:

@RequestMapping (value = "/ employee / {id}", produce = {"application / json", "application / xml"}, method = RequestMethod.GET) public @ResponseBody Employee getEmployeeById (@PathVariable long id) {return employeeMap .get (id); } 

Vyvolame to pomocou rozšírenia JSON na zadanie typu média prostriedku:

zvlnenie //localhost:8080/spring-mvc-basics/employee/10.json

Tu by sme sa mohli vrátiť, ak použijeme rozšírenie JSON:

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

A takto bude vyzerať požiadavka-odpoveď s XML:

zvlnenie //localhost:8080/spring-mvc-basics/employee/10.xml

Orgán odpovede:

 999-999-9999 10 Testovací zamestnanec 

Teraz, ak nepoužívame žiadne rozšírenie alebo použijete ten, ktorý nie je nakonfigurovaný, vráti sa predvolený typ obsahu:

zvlnenie // localhost: 8080 / jar-mvc-základy / zamestnanec / 10

Poďme sa teraz pozrieť na nastavenie tejto stratégie - s konfiguráciami Java aj XML.

3.1. Konfigurácia Java

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

Poďme si prejsť podrobnosti.

Najskôr povoľujeme stratégiu rozšírenia cesty. Za zmienku stojí aj to, že od jarného rámca 5.2.4 favorPathExtension (boolean) Táto metóda je zastaraná, aby sa zabránilo používaniu rozšírení o cestu pri rokovaniach o obsahu.

Potom deaktivujeme stratégiu parametrov URL a tiež súhlasiť stratégia hlavičky - pretože sa chceme spoliehať iba na spôsob určenia typu obsahu rozšírenia cesty.

Potom vypíname Java Activation Framework; JAF možno použiť ako náhradný mechanizmus na výber výstupného formátu, ak sa prichádzajúca požiadavka nezhoduje so žiadnou zo stratégií, ktoré sme nakonfigurovali. Deaktivujeme to, pretože ideme konfigurovať JSON ako predvolený typ obsahu. Vezmite prosím na vedomie, že the useJaf () metóda je od jarného rámca 5 zastaraná.

A nakoniec - nastavujeme JSON ako predvolený. To znamená, že ak sa nezhoduje žiadna z týchto dvoch stratégií, všetky prichádzajúce požiadavky sa namapujú na metódu radiča, ktorá slúži JSON.

3.2. Konfigurácia XML

Poďme sa tiež rýchlo pozrieť na rovnakú presnú konfiguráciu, iba pomocou XML:

4. Stratégia parametrov adresy URL

V predchádzajúcej časti sme použili rozšírenia o cestu - teraz nastavíme Spring MVC tak, aby využíval parameter cesty.

Túto stratégiu môžeme povoliť nastavením hodnoty favorParameter vlastnosť na pravdivý.

Poďme sa rýchlo pozrieť na to, ako by to fungovalo s našim predchádzajúcim príkladom:

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

A toto bude telo odpovede JSON:

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

Ak použijeme parameter XML, výstup bude vo formáte XML:

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

Orgán odpovede:

 999-999-9999 10 Testovací zamestnanec 

Teraz urobme konfiguráciu - opäť najskôr pomocou Javy a potom XML.

4.1. Konfigurácia Java

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

Poďme si prečítať túto konfiguráciu.

Najskôr samozrejme rozšírenie cesty a súhlasiť stratégie hlavičiek sú zakázané (rovnako ako JAF).

Zvyšok konfigurácie je rovnaký.

4.2. Konfigurácia XML

Tiež môžeme mať obe stratégie (rozšírenie a parameter) povolené zároveň:

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

V takom prípade bude Spring najskôr hľadať rozšírenie cesty, ak nie je, potom vyhľadá parameter cesty. A ak oba nie sú k dispozícii v požiadavke na vstup, potom sa vráti predvolený typ obsahu.

5. súhlasiť Stratégia hlavičky

Ak súhlasiť hlavička je povolená, Spring MVC bude hľadať hodnotu v prichádzajúcej žiadosti a určiť typ reprezentácie.

Musíme nastaviť hodnotu ignoreAcceptHeader na false, aby sme umožnili tento prístup, a deaktivujeme ďalšie dve stratégie, aby sme vedeli, že sa spoliehame iba na súhlasiť hlavička.

5.1. Konfigurácia Java

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

5.2. Konfigurácia XML

Nakoniec musíme zapnúť správcu vyjednávania obsahu tak, že ho do celkovej konfigurácie zapojíte:

6. Záver

A sme hotoví. Pozreli sme sa na to, ako vyjednávanie obsahu funguje na jar MVC, a zamerali sme sa na niekoľko príkladov nastavenia, ktoré umožňujú použitie rôznych stratégií na určenie typu obsahu.

Celú implementáciu tohto článku nájdete na GitHub.


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