JSON-parametre med fjeder-MVC

1. Oversigt

I denne korte vejledning skal vi se nærmere på, hvordan man arbejder med JSON-parametre i Spring MVC.

Først starter vi med en lille smule baggrund på JSON-parametre. Derefter går vi ned i kaninhullet for at se, hvordan man sender JSON-parametre i POST- og GET-anmodninger.

2. JSON-parametre i fjeder-MVC

Brug af JSON til at sende eller modtage data er en almindelig praksis blandt webudviklere. Den hierarkiske struktur af JSON-strengene giver en mere kompakt og menneskelig læsbar måde at repræsentere HTTP-anmodningsparametre på.

Som standard giver Spring MVC out-of-the-box databinding til enkle datatyper som f.eks Snor. Til dette formål bruger den en liste over indbyggede ejendomsredaktører under emhætten.

I virkelige projekter vil vi dog måske binde mere komplekse datatyper. For eksempel kan det være praktisk at kunne kortlægge en JSON-parameter i et modelobjekt.

3. Send JSON-data i POST

Spring giver en ligetil måde at sende JSON-data via POST-anmodninger. Den indbyggede @RequestBody annotering kan automatisk deserialisere de JSON-data, der er indkapslet i anmodningslegemet, til et bestemt modelobjekt.

Generelt behøver vi ikke selv analysere anmodningsorganet. Vi kan bruge Jackson-biblioteket til at gøre alt det tunge for os.

Lad os nu se, hvordan du sender JSON-data via en POST-anmodning i Spring MVC.

For det første er vi nødt til at oprette et modelobjekt til at repræsentere de beståede JSON-data. Overvej f.eks Produkt klasse:

offentlig klasse Produkt {privat int id; privat strengnavn; privat dobbelt pris; // standardkonstruktør + getters + setters}

Lad os sekundært definere en metode til Spring handler, der accepterer POST-anmodninger:

@PostMapping ("/ create") @ResponseBody public Product createProduct (@RequestBody Product product) {// tilpasset logisk returprodukt; }

Som vi kan se, kommentere produkt argument med @RequestBody er nok til at binde de JSON-data, der sendes fra klienterne.

Nu kan vi teste vores POST-anmodning ved hjælp af cURL:

curl -i \ -H "Accept: application / json" \ -H "Content-Type: application / json" \ -X POST --data \ '{"id": 1, "name": "Asus Zenbook", "pris": 800} '"// localhost: 8080 / spring-mvc-basics-4 / products / create"

4. Send JSON-parameter i GET

Spring MVC tilbyder @RequestParam for at udtrække forespørgselsparametre fra GET-anmodninger. Men i modsætning til @RequestBody, det @RequestParam kommentar understøtter kun enkle datatyper som f.eks int og Snor.

Så for at sende JSON skal vi definere vores JSON-parameter som en simpel streng.

Det store spørgsmål her er: Hvordan konverterer vi vores JSON-parameter (som er en Snor) til et objekt af Produkt klasse?

Svaret er ret simpelt! Det ObjectMapper klasse fra Jackson-biblioteket tilbyder en fleksibel måde at konvertere JSON-strenge til Java-objekter.

Lad os nu se, hvordan du sender en JSON-parameter via en GET-anmodning i Spring MVC. Først skal vi oprette en anden behandlingsmetode i vores controller til at håndtere GET-anmodninger:

@GetMapping ("/ get") @ResponseBody offentligt produkt getProduct (@RequestParam String-produkt) kaster JsonMappingException, JsonProcessingException {Product prod = objectMapper.readValue (product, Product.class); tilbagevenden prod; }

Som vist ovenfor er readValue () metode tillader deserialisering af JSON-parameteren produkt direkte ind i en instans af Produkt klasse.

Bemærk, at vi definerer vores JSON-forespørgselsparameter som en Snor objekt. Hvad nu, hvis vi vil passere en Produkt objekt som vi gjorde, når du bruger @RequestBody?

For at besvare dette spørgsmål leverer Spring en kortfattet og fleksibel løsning gennem brugerdefinerede ejendomsredaktører.

Først, Vi bliver nødt til at oprette en brugerdefineret egenskabseditor til at indkapsle logikken i at konvertere JSON-parameteren givet som en Snor til en Produkt objekt:

offentlig klasse ProductEditor udvider PropertyEditorSupport {private ObjectMapper objectMapper; public ProductEditor (ObjectMapper objectMapper) {this.objectMapper = objectMapper; } @ Override offentlig ugyldighed setAsText (strengtekst) kaster IllegalArgumentException {if (StringUtils.isEmpty (text)) {setValue (null); } andet {Produkt prod = nyt produkt (); prøv {prod = objectMapper.readValue (tekst, Product.class); } fange (JsonProcessingException e) {throw new IllegalArgumentException (e); } setValue (prod); }}}

Lad os derefter binde JSON-parameteren til et objekt fra Produkt klasse:

@GetMapping ("/ get2") @ResponseBody offentligt produkt get2Product (@RequestParam produktprodukt) {// tilpasset logisk returprodukt; }

Endelig skal vi tilføje det sidste manglende stykke af puslespillet. Lad os Tilmeld ProductEditor i vores Spring controller:

@InitBinder public void initBinder (WebDataBinder binder) {binder.registerCustomEditor (Product.class, new ProductEditor (objectMapper)); }

Husk det vi skal URL-kode JSON-parameteren for at sikre sikker transport.

Så i stedet for:

GET / spring-mvc-basics-4 / products / get2? Product = {"id": 1, "name": "Asus Zenbook", "price": 800}

Vi skal sende:

GET / fjeder-mvc-basics-4 / produkter / get2? Produkt =% 7B% 22id% 22% 3A% 201% 2C% 22navn% 22% 3A% 20% 22Asus% 20 Zenbook% 22% 2C% 22 pris% 22% 3A % 20800% 7D

5. Konklusion

For at opsummere det så vi, hvordan vi kunne arbejde med JSON i Spring MVC. Undervejs viste vi, hvordan man sender JSON-parametre i POST- og GET-anmodninger.

Som altid er den fulde kildekode for eksemplerne tilgængelig på GitHub.