JSON parametri s MVC oprugom

1. Pregled

U ovom kratkom uputstvu detaljno ćemo pogledati kako raditi s JSON parametrima u Spring MVC-u.

Prvo ćemo započeti s malo pozadine JSON parametara. Zatim ćemo se spustiti niz zečju rupu da vidimo kako poslati JSON parametre u POST i GET zahtjevima.

2. JSON parametri u proljetnom MVC-u

Korištenje JSON-a za slanje ili primanje podataka uobičajena je praksa među web programerima. Hijerarhijska struktura JSON nizova nudi kompaktniji i razumljiviji način predstavljanja parametara HTTP zahtjeva.

Prema zadanim postavkama, Spring MVC nudi gotovo vezanje podataka za jednostavne vrste podataka, kao što je Niz. U tu svrhu koristi popis ugrađenih uređivača svojstava ispod haube.

Međutim, u stvarnim projektima možda bismo htjeli povezati složenije tipove podataka. Na primjer, moglo bi biti korisno moći preslikati JSON parametar u objekt modela.

3. Pošaljite JSON podatke putem POST-a

Spring pruža jednostavan način slanja JSON podataka putem POST zahtjeva. Ugrađeni @RequestBody napomena može automatski deserijalizirati JSON podatke inkapsulirane u tijelu zahtjeva u određeni objekt modela.

Općenito, ne moramo sami raščlaniti tijelo zahtjeva. Možemo koristiti Jackson knjižnicu da nam naprave sve teške stvari.

Sada, pogledajmo kako poslati JSON podatke putem POST zahtjeva u Spring MVC.

Prvo, moramo stvoriti objekt modela koji će predstavljati proslijeđene JSON podatke. Na primjer, razmotrite Proizvod razred:

proizvod javne klase {private int id; privatni naziv niza; privatna dvostruka cijena; // zadani konstruktor + getteri + postavljači}

Kao drugo, definirajmo metodu rukovatelja Spring koja prihvaća POST zahtjeve:

@PostMapping ("/ create") @ResponseBody javni proizvod createProduct (@RequestBody Product product) {// proizvod prilagođene logike; }

Kao što vidimo, bilježeći proizvod rasprava sa @RequestBody dovoljno je povezati JSON podatke poslane od klijenata.

Sada možemo testirati naš POST zahtjev koristeći cURL:

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

4. Pošaljite JSON parametar u GET

Proljetni MVC nudi @RequestParam za izdvajanje parametara upita iz GET zahtjeva. Međutim, za razliku od @RequestBody, the @RequestParam napomena podržava samo jednostavne tipove podataka poput int i Niz.

Dakle, da bismo poslali JSON, morat ćemo definirati naš JSON parametar kao jednostavan niz.

Ovdje je veliko pitanje: Kako pretvoriti naš JSON parametar (koji je Niz) u objekt Proizvod razred?

Odgovor je prilično jednostavan! The ObjectMapper klasa koju pruža Jackson knjižnica nudi fleksibilan način pretvaranja JSON nizova u Java objekte.

Sada, da vidimo kako poslati JSON parametar putem GET zahtjeva u Spring MVC. Prvo, trebamo stvoriti drugu metodu rukovatelja u našem kontroleru za obradu GET zahtjeva:

@GetMapping ("/ get") @ResponseBody javni proizvod getProduct (proizvod @RequestParam String) baca JsonMappingException, JsonProcessingException {Product prod = objectMapper.readValue (product, Product.class); povratni proizvod; }

Kao što je gore prikazano, readValue () metoda omogućuje deserializaciju JSON parametra proizvod izravno u instancu Proizvod razred.

Imajte na umu da smo definirali naš parametar upita JSON kao a Niz objekt. Sad, što ako želimo položiti Proizvod objekt kao što smo to činili kad smo koristili @RequestBody?

Da bi odgovorio na ovo pitanje, Spring pruža koncizno i ​​fleksibilno rješenje putem prilagođenih uređivača svojstava.

Prvi, trebat ćemo izraditi prilagođeni uređivač svojstava za inkapsuliranje logike pretvaranja JSON parametra navedenog kao Niz do a Proizvod objekt:

javna klasa ProductEditor proširuje PropertyEditorSupport {private ObjectMapper objectMapper; javni ProductEditor (ObjectMapper objectMapper) {this.objectMapper = objectMapper; } @Override public void setAsText (tekst niza) baca IllegalArgumentException {if (StringUtils.isEmpty (text)) {setValue (null); } else {Product prod = new Product (); isprobajte {prod = objectMapper.readValue (text, Product.class); } catch (JsonProcessingException e) {baciti novi IllegalArgumentException (e); } setValue (prod); }}}

Dalje, povežimo JSON parametar s objektom od Proizvod razred:

@GetMapping ("/ get2") @ResponseBody javni proizvod get2Product (proizvod proizvoda @RequestParam) {// proizvod prilagođene logike; }

Na kraju, moramo dodati posljednji dio slagalice koji nedostaje. Idemo Registar ProductEditor u našem proljetnom kontroleru:

@InitBinder javna praznina initBinder (vezivo WebDataBinder) {binder.registerCustomEditor (Product.class, novi ProductEditor (objectMapper)); }

Imajte to na umu trebamo kodirati URL parametar JSON kako bismo osigurali siguran transport.

Dakle, umjesto:

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

Moramo poslati:

GET / spring-mvc-basics-4 / products / get2? Product =% 7B% 22id% 22% 3A% 201% 2C% 22name% 22% 3A% 20% 22Asus% 20Zenbook% 22% 2C% 22price% 22% 3A % 20800% 7D

5. Zaključak

Da rezimiramo, vidjeli smo kako raditi s JSON-om u Spring MVC-u. Usput smo prikazali kako poslati JSON parametre u POST i GET zahtjevima.

Kao i uvijek, puni izvorni kod primjera dostupan je na GitHub-u.