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.