Spring MVC Content Onderhandeling

1. Overzicht

In dit artikel wordt beschreven hoe u inhoudsonderhandeling implementeert in een Spring MVC-project.

Over het algemeen zijn er drie opties om het mediatype van een verzoek te bepalen:

  • Het gebruik van URL-achtervoegsels (extensies) in het verzoek (bijv .xml / .json)
  • Met behulp van de URL-parameter in het verzoek (bijv ? format = json)
  • Gebruik makend van Aanvaarden header in het verzoek

Standaard is dit de volgorde waarin de Spring content-onderhandelingsmanager deze drie strategieën zal proberen te gebruiken. En als geen van deze is ingeschakeld, kunnen we een terugval naar een standaard inhoudstype specificeren.

2. Strategieën voor inhoudsonderhandelingen

Laten we beginnen met de nodige afhankelijkheden - we werken met JSON- en XML-representaties, dus voor dit artikel gebruiken we Jackson voor JSON:

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

Voor XML-ondersteuning kunnen we JAXB, XStream of de nieuwere Jackson-XML-ondersteuning gebruiken.

Omdat we het gebruik van de Aanvaarden koptekst in een eerder artikel over HttpMessageConverters, laten we ons eens verdiepen in de eerste twee strategieën.

3. De URL-achtervoegselstrategie

Deze strategie is standaard uitgeschakeld, maar het framework kan rechtstreeks vanaf de URL controleren op een padextensie om het inhoudstype van de uitvoer te bepalen.

Laten we, voordat we ingaan op configuraties, snel een voorbeeld bekijken. We hebben de volgende eenvoudige API-methode-implementatie in een typische Spring-controller:

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

Laten we het aanroepen door gebruik te maken van de JSON-extensie om het mediatype van de bron te specificeren:

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

Dit is wat we kunnen terugkrijgen als we een JSON-extensie gebruiken:

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

En hier is hoe het verzoek-antwoord eruit zal zien met XML:

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

Het antwoordorgaan:

 999-999-9999 10 Testmedewerker 

Nu, als we geen extensie gebruiken of gebruik er een die niet is geconfigureerd, het standaard inhoudstype wordt geretourneerd:

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

Laten we nu eens kijken naar het opzetten van deze strategie - met zowel Java- als XML-configuraties.

3.1. Java-configuratie

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

Laten we de details bespreken.

Ten eerste maken we de strategie voor padextensies mogelijk. Het is ook vermeldenswaard dat vanaf Spring Framework 5.2.4 het favorPathExtension (boolean) methode is verouderd om het gebruik van padextensies voor inhoudsonderhandelingen te ontmoedigen.

Vervolgens schakelen we zowel de URL-parameterstrategie als de Aanvaarden header-strategie - omdat we alleen willen vertrouwen op de padextensie-manier om het type inhoud te bepalen.

We zetten dan het Java Activation Framework uit; JAF kan worden gebruikt als een terugvalmechanisme om het uitvoerformaat te selecteren als het inkomende verzoek niet overeenkomt met een van de strategieën die we hebben geconfigureerd. We schakelen het uit omdat we JSON gaan configureren als het standaard inhoudstype. Houd er rekening mee dat de useJaf () methode is verouderd vanaf Spring Framework 5.

En tot slot - we stellen JSON in als standaard. Dat betekent dat als geen van de twee strategieën overeenkomt, alle inkomende verzoeken worden toegewezen aan een controllermethode die JSON bedient.

3.2. XML-configuratie

Laten we ook snel kijken naar dezelfde exacte configuratie, alleen met behulp van XML:

4. De URL-parameterstrategie

We hebben padextensies gebruikt in de vorige sectie - laten we nu Spring MVC instellen om gebruik te maken van een padparameter.

We kunnen deze strategie mogelijk maken door de waarde van de favorParameter eigenschap waar.

Laten we snel kijken hoe dat zou werken met ons vorige voorbeeld:

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

En hier is wat de JSON-responsbody zal zijn:

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

Als we de XML-parameter gebruiken, is de uitvoer in XML-vorm:

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

Het antwoordorgaan:

 999-999-9999 10 Testmedewerker 

Laten we nu de configuratie doen - nogmaals, eerst met behulp van Java en dan XML.

4.1. Java-configuratie

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

Laten we deze configuratie eens doorlezen.

Ten eerste natuurlijk de padextensie en de Aanvaarden header-strategieën zijn uitgeschakeld (evenals JAF).

De rest van de configuratie is hetzelfde.

4.2. XML-configuratie

We kunnen ook hebben beide strategieën (extensie en parameter) ingeschakeld tegelijkertijd:

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

In dit geval zoekt Spring eerst naar padextensie, als dat niet aanwezig is, zoekt Spring naar padparameter. En als beide niet beschikbaar zijn in het invoerverzoek, wordt het standaard inhoudstype teruggegeven.

5. Het Aanvaarden Header-strategie

Als het Aanvaarden header is ingeschakeld, zoekt Spring MVC naar de waarde ervan in het inkomende verzoek om het weergavetype te bepalen.

We moeten de waarde instellen van ignoreAcceptHeader naar false om deze aanpak mogelijk te maken en we schakelen de andere twee strategieën uit, alleen maar zodat we weten dat we alleen vertrouwen op de Aanvaarden koptekst.

5.1. Java-configuratie

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

5.2. XML-configuratie

Ten slotte moeten we de contentonderhandelingsmanager inschakelen door deze in de algemene configuratie te pluggen:

6. Conclusie

En we zijn klaar. We hebben gekeken naar hoe inhoudsonderhandelingen werken in Spring MVC en we hebben ons gericht op een paar voorbeelden van het opzetten ervan om verschillende strategieën te gebruiken om het inhoudstype te bepalen.

De volledige implementatie van dit artikel is te vinden op GitHub.