5. membuat aplikasi berbasis rest

  • 2,697 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,697
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
114
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Solusi Mengakses RESTPengembangan Aplikasi MVC dengan RESTMengacu pada kasus pada bab sebelumnya, maka dengan ini akan diteruskan kasus pengembanganyaitu menggunakan Person sebagai kasus. Berikut ini adalah implementasi dari PersonControllerdan PersonService. Jujur saja, kode dalam subbab ini adalah modifikasi kecil dari code contohREST dari Struts2, yang mana kode ini yang menjadi acuan migrasi dari Cimande 1.x ke 2.x, darikemampuan MVC biasa menjadi RESTful MVC.Yang menarik dari kasus kecil ini adalah untuk mempelajari mekanisme bagaimana pengembanganREST dilakukan, serta bagaimana merubah sebuah action dengan result jsp menjadi sebuah json,yang siap digunakan sebagai metadata pengembangan berbasis service atau peningkatankemampuan interoperabilitas. Yang mana semua hal ini akan menjadi sajian utama buku ini.Sebuah proyek kecil s2-rest-showcase, yang mengimplementasikan sebuah POJO Person, yangterdiri dari Nama dan Amount, dengan implementasi PersonController untuk memetakan hasilproses dengan lapisan presentasi (JSP) serta PersonService yang memiliki beberapa method sepertigetAll(), save(), remove(), dan get(). REST showcase ini kalau ditilik lebih lanjut memilikibeberapa kelemahan, oleh karena itu kami memodifikasinya dengan membuatCimandeActionMapper dan membuat implementasi JSON dengan Jackson. Yang mana semaunyaakan dibahas dibab ini.Bab ini akan dijelaskan dimulai dari aplikasi REST berjenis produser, dilanjutkan denganimplementasi dari REST yang ditelah dikembangkan menggunakan aplikasi Java sederhana. Semuadengan kasus obyek Person. Implementasi diakhir bab adalah implementasi REST aplikasisederhana ini dikembangkan menjadi sebuah sumber data atau data source alternatif selainHibernate. Sebuah pendekatan perubahaan data source dari database menjadi services menggunakanmengutilisasi mekanisme injection.Aplikasi produser layanan REST pertama adalah yang merupakan sebuah Array, dilanjutkan denganimplementasi Cimande dan Yama berbasis REST yang menggunakan Hibernate sebagai datasource.Fitur REST sebenarnya sudah tertuang dalam bab sebelumnya, maklum sejak REST pluginsdirelease, aplikasi web dengan Struts2 otomatis menjadi REST, dan kami mencoba membuat versiSpringMVC dengan kodename Yama, ternyata hasilnya sama juga. Dengan ini pembuktian bahwapengembangan aplikasi REST adalah tidak mengembangkan sistem baru seperti halnya SOA,adalah benar apa adanya. Sehingga aset yang telah ada, dapat dimigrasi ke RESTfull tanpa perluinvestasi tim pengembang baru. Menarik bukan!.Struts2 telah memiliki fitur otomatis merubah setiap presentation view bilamana kita telahmenambahkan template, tetap metadata baik JSON ataupun XML, tetap dihasilkan, hanya denganmenambahkan .json atau .xml dikhir URI. Untuk kasus Cimande dalam buku ini, karenamenggunakan modifikasi dari JSON plugin dari json ke Jackson, maka extension akhir adalah.jackson, dengan output sama-sama JSON.Kurang lebih output bilamana kita mengakses result yaitu dengan URLhttp://localhost:8080/cimande/person/result adalah sebagai berikut:HTTP/1.1 200 OK
  • 2. Date: Mon, 28 Feb 2011 03:37:29 GMTContent-Length: 641Content-Type: application/jsonServer: Apache-Coyote/1.1[{address:"",parent:{address:"",parent:null,id:"402881f32e5b2e01012e5b3314b20002",status:"single",firstName:"Frans",lastName:"Thamura",gender:true,birthdate:1296493200000,relation:null},id:"402881f32e5b2e01012e5b32d42b0001",status:"single",firstName:"Frans",lastName:"Thamura",gender:true,birthdate:null,relation:null},{address:"",parent:null,id:"402881f32e5b2e01012e5b3314b20002",status:"single",firstName:"Frans",lastName:"Thamura",gender:true,birthdate:1296493200000,relation:null},{address:"",parent:null,id:"402881f32e5d5a5d012e5d5af5420001",status:"single",firstName:"F",lastName:"F",gender:true,birthdate:1296493200000,relation:null}]Untuk memulai pengembangan REST, mari kita menjalankan aplikasi Struts2 REST showcase yangdisertakan dalam DVD buku ini.Importlah kedalam Eclipse, dan jalankan. Akan langsung diredirect ke URLhttp://localhost:8080/S2ShowCase/persons. Sebuah hasil pencarian dihasilkan.Harap memperhatikan source code yang ada disamping kiri, betul sekali. PersonController memilkibanyak method, dan setiap method terhubung dengan file JSP yang berada di folder content dalamWebContent.Setting method didalam PersonController adalah tanpa setting apapun, sehingga bilamana kitamembuat satu method, misalnya makan, maka otomatis dibutuhkan persons-makan.jsp, sebagaitemplate presentation layernya.
  • 3. Contoh REST Show case adalah menggunakan Person, metode yang mirip yang dijelaskan dibabsebelumnya, tetapi showcase ini sangat baik untuk menjadi ajang pembelajaran, karena hanyamenggunakan template dan action, tidak ada persistance, injection atau sejenisnya. Ini adalahsebuah contoh aplikasi web dengan MVC yang sederhana.Untuk memudahkan memahami showcase dapat melihat diagram dibawah ini: Diagram menjelaskan ada Controller, Service dan POJO.Adapun hubungan antara PersonController, PersonService dan Person adalah sama dengan kasusbab sebelumnya. Berikut adalah desain UMLnya.
  • 4. UML Person ShowcaseBandingkan dengan mekanisme bab sebelumnya, lebih mudah dan praktis bukan. Bilamana kitahendak mempoint method ke template yang kita tentukan, seperti konsep yang dijelaskan pada babberikutnya. Tunggulah jawabannya, akan dijelaskan setelah ini.Implementasi RESTBab sebelumnya menjelaskan bagaimana sebuah controller, injection dan mengembangkan aplikasiMVC diatas sebuah integration framework. Pengembangan aplikasi MVC akan semakin mudah,bilamana integration frameworknya sangat terpadu dan modular. Contoh pengembangan aplikasiCRUD dengan kasus table pegawai telah dijelaskan. Proses berikutnya adalah mengembangkannyamenjadi REST.Bab ini diharapkan ada peningkatan pengembangan yaitu mengimplementasikan pattern DAO danjuga implementasi Service. Sebuah mekanisme yang memisahkan hubungan ke model dan membuatsebuah controller bersifat pelayanan.Untuk memulainya hanya memerlukan mengimport code Cimande2 ke Eclipse WTP, danmenjalankannya dengan Tomcat (code jalan di Tomcat versi 6 maupun 7). Tetapi code dalam bukuini menggunakan Tomcat 7.Bilamana telah berjalan sebuah form new dengan URI /person/new akan dijalankan oleh Eclipse,dan sebuah form isian kosong akan terbentuk.Harap diperhatikan, saat menjalanknyannya setuplah database dengan benar. Setting database dapatdengan membuka hibernate.cfg.xml.
  • 5. Cobalah melakukan pengisian beberapa kali, dan jalankan URL berikuthttp://localhost:8080/Cimande2/person. Sebuah search result akan terbentuk.Yang ajaib dari proyek Cimande2 ini adalah, kita tidak perlu membuat database, table atau fieldnya,hanya dengan merubah setting hibernate.cfg.xml, dan secara otomatis saat dijalankan table dibuat.Lebih hebat lagi bilamana, kita merubah entity yang ada, dan secara otomatis skema table dirubahmengacu pada table yang baru. Upgrade otomatis, hebat sekali bukan.Coba click “Edit” dan akan muncul sebuah form edit dengan URI /person/{id}, id yang dimaksudadalah id dari field, silahkan masuk ke database, dan buka table nya dan cari idnya.Harap diperhatikan, id tidak auto increment, dan digenerate oleh sistem, dalam kasus ini oleh
  • 6. Hibrnate, informasi lebih lanjut mengenai generate id dapat melihat DefaultPersistance.Yang menarik dari kode yang disertakan dibab sebelumnya dengan bab ini adalah implementasiController. Berikut adalah PersonController, dan setiap method yang dibuat mewakili satu action.Harap memperhatikan annonation yang ada, yaitu @Result, terdapat beberapa mekanismeimplementasi yaitu velocity dan redirect, yang artinya action yang dijalankan menggunakantemplate engine velocity dan yang tidak ada presentasi result melakukan redirect ke action lainnya..Menampilkan metadata JSON atau XMLCimandeYamaMengkonsumsi layanan berbasis RESTSubbab ini akan mendalami bagaimana mengkonsumsi layanan yang dihasilkan dari aplikasi yangtelah dikembangkan. Untuk mengimplementasikannya, tetap digunakan pendekatan CRUD,sehingga mekanismenya dapat digunakan menjadi aplikasi lain. Metode yang akan diterangkanakan terus berkelanjutan, dibab berikutnya akan digunakan dalam implementasi dalam lingkunganAndroid, sedangkan diakhir bab akan digunakan untuk menciptakan composite dashboard denganLiferay. Impelementasi yang tidak dijelaskan dalam bab ini adalah mengkonsumsinyamenggunakan Javascript, baik itu menggunakan ExtJS ataupun JQuery.Secara konsep, mengkonsumsi REST adalah mirip dengan mekanisme menggunakan databasesebagai sumber data, hanya jenisnya saja yang berubah dari database menjadi metadata baik ituXML atau JSON.
  • 7. JSON digunakan karena implementasinya dapat langsung didalam browser, dan dikarenakan harusmelakukan konversi XML ke JSON (Array Javascript), dan prosesnya membutuhkan resource,sehingga JSON diproses diserver. Implementasi ini malah menjadi kebablasan, sehingga aplikasiyang non browser juga ikut-ikutan mengimplementasikannya. Dan salah satu implementasinya yangkebablasan ini adalah buku ini, dimulai dari bab ini.Implementasi dari aplikasi yang telah kita kembangkan, bilamana telah menjadi RESTful, adalahterdiri dari dua tipe, yaitu layanan yang public tanpa keamanan, dan layanan yang membutuhkankeamanan.Layanan yang public yang umum adalah RSS dari blog, sedangkan layanan yang membutuhkankeamanan, digunakan umumnya untuk melindungi data, atau pemisahan konten sesuai denganjenjang. Impelementasi data yang dengan keamanan yang sangat mudah dipahami adalah Flickrdengan Web APInya atau implementasi aplikasi Facebook. Izin Mengakses REST pada Facebook yang menggunakan kunci keamananMengkonsumsi REST publikDalam implementasi konsumsi layanan REST publik, sebenarnya kita hanya membutuhkan URIdari HTTP, dan kemudian hanya perlu mengimplementasikannya, mau GET atau POST. POSTsebaiknya digabungkan dengan security lainnya, bilamana tidak, dijamin spammer akan menyerangsecara dahsyat.Sub area bab ini dijelaskan mengenai pengembangan aplikasi yang mengkonsumsi layanan RESTberjenis JSON, adalah untuk pemahaman semata. Sebaiknya keamanan diimplementasikan. Wongdengan keamanan berlapis saja, bisa dijebol.Diagram dibawah ini menjelaskan bagaimana melakukan pengkonsumsian dengan URIhttp://localhost:8080/person, dimana dalam implementasinya adalah http://localhost:8080/cimande/
  • 8. person, bilamana menggunakan Cimande, dan http://localhost:8080/yama/person, bilamanamenggunakan Yama. Mekanisme pengkonsumsian layanan RESTBerikut adalah sumber kode dari HTTPGetPerson, yang mengkonsumsi layanan REST, tetapi datayang dikembalikan hanya 1 data, data tersebut akan dikonversi menjadi obyek Person. Lebihjelasnya silahkan buka file HTTPGetPersonpackage org.blueoxygen.cimande.httpclient;public class HTTPGetPerson { public static void main(String[] args) { String scheme = "http"; String host = "localhost"; int port = 8080; String contextPath = "Cimande"; ObjectMapper mapper = new ObjectMapper(); try { HttpClient client = new DefaultHttpClient(); HttpResponse response = null; String sampleId = "ff8081812e7afe23012e7affa8310003"; URI uri = URIUtils.createURI(scheme, host, 8080, contextPath + "/person/" + sampleId + "/edit.jackson", null, null); HttpUriRequest request = new HttpGet(uri); response = client.execute(request); // return json from URL become String theJSON String theJSON = EntityUtils.toString(response.getEntity()); System.out.println("Return : " + theJSON); Person person = mapper.readValue(theJSON, Person.class); System.out.println("First Name : " + person.getFirstName()); System.out.println("Last Name : " + person.getLastName()); System.out.println("Parent : " + (person.getParent() == null ? "" : person.getParent() .getFirstName() + " " + person.getParent().getLastName())); } catch (Exception e) { e.printStackTrace(); } }}Yang patut diperhatikan dari kode diatas adalah URI, sampleId, dan mapper.readValue(). DimanaURI adalah sumber datanya, sedangkan sampleId adalah ID atau primary key dari data yang hendakkita tampilkan, sedangkan mapper.readValue() digunakan untuk mengkonversi JSON yang didapatdari server menjadi Person.class.Berikut ini adalah bilamana hendak melakukan pengambilan data, tetapi data yang dikembalikanlebih dari satu data, dan bilamana dikonversi menjadi sebuah koleksi data, yang terdiri dari banyakobyek Person.Kata kunci dari merubah JSON yang lebih dari satu data, menjadi sebuah koleksi adalah sebagai
  • 9. berikut:public List<Person> getPersonsJackson(String json) throws JsonParseException, JsonMappingException, IOException { TypeReference<ArrayList<Person>> typeReference = new TypeReference<ArrayList<Person>>() { }; List<Person> persons = mapper.readValue(json, typeReference); return persons; }TypeReference ini akan merubah JSON yang masuk menjadi ArrayList, yang mana persons yangdireturn adalah List.Metod getPersonsJackson() dikombinasikan dengan hasil dari HTTPreqeust, menjadi List denganvalue berjenis obyek Person.Berikut adalah implementasi dari metho getPersonsJackson() menjadi JSON.HTTPGetPersons person = new HTTPGetPersons();HttpClient client = new DefaultHttpClient();HttpResponse response = null;URI uri = URIUtils.createURI(scheme, host, 8080, contextPath + "/person/result.jackson", null, null);HttpUriRequest request = new HttpGet(uri);response = client.execute(request);// return json from URL become String theJSONString theJSON = EntityUtils.toString(response.getEntity());System.out.println("POST " + uri);System.out.println("Return : " + theJSON);System.out.println();String status = "";for (Header header : response.getAllHeaders()) { status = status + header.getValue() + "n";}System.out.println("------ Convert via Jackson ------");for (Person p : person.getPersonsJackson(theJSON)) {Adapun kode lengkap dari mengambil data menggunakan HttpGet adalah sebagai berikut:package org.blueoxygen.cimande.httpclient;public class HTTPGetPersons { private ObjectMapper mapper = new ObjectMapper(); private Gson gson = new Gson(); public List<Person> getPersonsJackson(String json) throws JsonParseException, JsonMappingException, IOException { TypeReference<ArrayList<Person>> typeReference = new TypeReference<ArrayList<Person>>() { }; List<Person> persons = mapper.readValue(json, typeReference); return persons; } public List<Person> getPersonsGson(String json) { Type listType = new TypeToken<ArrayList<Person>>() {}.getType(); List<Person> persons = gson.fromJson(json, listType);
  • 10. return persons; } public String getSecret(String json) throws JsonParseException, JsonMappingException, IOException { return mapper.readValue(json, HashMap.class).get("secret") + ""; } // this class will consume Person rest URL and return Persons, and interate // Person.. public static void main(String[] args) { String scheme = "http"; String host = "localhost"; int port = 8080; String contextPath = "Cimande"; try { HTTPGetPersons person = new HTTPGetPersons(); HttpClient client = new DefaultHttpClient(); HttpResponse response = null; URI uri = URIUtils.createURI(scheme, host, 8080, contextPath + "/person/result.jackson", null, null); HttpUriRequest request = new HttpGet(uri); response = client.execute(request); // return json from URL become String theJSON String theJSON = EntityUtils.toString(response.getEntity()); System.out.println("POST " + uri); System.out.println("Return : " + theJSON); System.out.println(); String status = ""; for (Header header : response.getAllHeaders()) { status = status + header.getValue() + "n"; } System.out.println("------ Convert via Jackson ------"); for (Person p : person.getPersonsJackson(theJSON)) { System.out.println("First Name : " + p.getFirstName()); System.out.println("Last Name : " + p.getLastName()); System.out.println("------------------------------"); } System.out.println(); System.out.println("------ Convert via Gson ------"); for (Person p : person.getPersonsGson(theJSON)) { System.out.println("First Name : " + p.getFirstName()); System.out.println("Last Name : " + p.getLastName()); System.out.println("------------------------------"); } } catch (Exception e) { e.printStackTrace(); } }}Bagaimana bilamana hendak mengirim data? Tentu saja implementasi POST yang harus kitagunakan, adapun implementasinya dipecah menjadi 2 area, yaitu implementasi koleksi untukmasukan atau parameter, dan pengiriman parameter untuk ekskusi.Berikut adalah implementasi koleksi masukan atau paramternya; // Set request parameter List<NameValuePair> formparams = new ArrayList<NameValuePair>(); formparams.add(new BasicNameValuePair("username", "dianw")); formparams.add(new BasicNameValuePair("password", "dianw")); formparams.add(new BasicNameValuePair("firstName", "Dian")); formparams.add(new BasicNameValuePair("lastName", "Aditya"));
  • 11. formparams.add(new BasicNameValuePair("gender", "true"));Sedangkan implementasi melakukan pengiriman informasi adalah sebagai berikut:HttpPost httpPost = new HttpPost(uri);//httpPost.setHeader("Content-type", "text/html");UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams);httpPost.setEntity(entity);System.out.println(uri);HttpClient client = new DefaultHttpClient();HttpResponse response = client.execute(httpPost);Mengimplementasikan Keamanan dalam pengiriman data REST.Mekanisme yang telah dijelaskan adalah mengkonsumsi data yang dihasilkan REST server tanpakeamanan, termasuk juga mengirim atau memasukan data ke dalam REST server. Mekanisme ituadalah sangat tidak aman dan sangat mudah diserang spammer, khususnya yang POST.Untuk mengimplementasikan security, diperlukan seperti layanan tambahan untuk memproses danmengola data yang berjenis keamanan, yang notabene umumnya berhubungan dengan user,password atau sejenisnya.Berikut adalah UML dari implementasi token interceptor yang bertugas mengfilter setiap requestREST. Diagram UML Implementasi Keamanan dengan TokenImplementasi token keamanan didalam lingkungan REST adalah sangat penting, sebab jenistransaksi REST adalah state less, yang berarti setiap request dengan request lainnya tidak saling
  • 12. berhubungan. Berbeda dengan implementasi pada browser, yang ditahan adalah sessionnya, yangakan jatuh tempo setelah 20 menit umumnya, dimana saat itu diperlukan login kembali.Lingkungan REST yang statefull memerlukan identifikasi sendiri untuk membuat setiap requestmemiliki keterkaitan.Implementasi UML diatas adalah sama dan mirip dengan implementasi Person, yang telah dibahasdibab sebelumnya, dimana ditemukan Controller, Service dan Model. Yang membedakan adalahimplementasinya tidak menjadi View baik itu HTML atau JSON ataupun XML, melainkandigabungkan kedalam interceptor. Kalau diperhatikan didalam kode sumber Cimande, ada 2implementasi interceptor, untuk memproses .jackson yang merupakan plugin Strut2 danimplementasi token ini.Banyaknya interceptor adalah tidak dibatasi, dan tentu saja berhubungan langsung denganperformansi server, karena setiap interceptor membutuhkan resource.Telah dikembangkan GetToken, sebuah aplikasi sederhana untuk merubah username dan password,menjadi token yang diambil dari table User (variable secret yang berjenis String). Mekanisme pemrosesan username/password menjadi tokenURI dari token adalah /login, artinya implementasi dari UserController. Berikut adalah annonationdari UserController yang melakukan mapping terhadap /login adalah@Actions( { @Action("/user/login"), @Action("/user/register") }).Implementasi pembuatan secret key atau token keamanan ini, masih sangat sederhana, hanyamengimplementasikan UUID.randomUUID().user.setSecret(UUID.randomUUID().toString());Sedangkan untuk menggunakannya adalah dengan implementasi seperti iniURI uri = URIUtils.createURI(scheme, host, port, contextPath + "/person/" + sampleId + "/edit.jackson", "key=" + secret, null);Dimana key yang dimasukan akan diproses bukan oleh PersonController, tetapi olehServiceInterceptor.if (request.getParameter("key") != null) { User user = service.getBySecret(request.getParameter("key")); if (user != null) { return invocation.invoke(); } }
  • 13. Key ini adalah pintu untuk memperbolehkan mengambil data Person, dan PersonController akandiproses.Berikut adalah diagram untuk menjelaskan proses pengambilan obyek Person yang lebih dari satu. Implementasi mengambil data dari server REST dengan mekanisme tokenBerikut adalah implementasi dari kode yang telah dijelaskan diawal bab ini tetapi menggunakantoken, untuk lebih lengkapnya silahkan melihat kode sumber bab ini.GetPersonWithToken: HttpClient client = new DefaultHttpClient(); HttpResponse response = null; String theJSON = ""; // Get secret key String secret = GetToken.getSecret("dian", "dian"); String sampleId = "ff8081812e7afe23012e7affa8310003"; URI uri = URIUtils.createURI(scheme, host, port, contextPath + "/person/" + sampleId + "/edit.jackson", "key=" + secret, null); HttpUriRequest request = new HttpGet(uri); response = client.execute(request);GetPersonsWithToken: HTTPGetPersonsWithToken person = new HTTPGetPersonsWithToken(); HttpClient client = new DefaultHttpClient(); HttpResponse response = null; // Get secret key String secret = GetToken.getSecret("dian", "dian"); URI uri = URIUtils.createURI(scheme, host, 8080, contextPath + "/person/result.jackson", "key=" + secret, null); HttpUriRequest request = new HttpGet(uri); response = client.execute(request); // return json from URL become String theJSON String theJSON = EntityUtils.toString(response.getEntity());
  • 14. Bekerja dengan JSONFactoryTelah dijelaskan pada sub bab diatas, mengenai bagaimana mengkonsumsi sebuah layanan berbasisREST dengan output JSON, baik layanan publik tanpa hak akses ataupun dengan mekanisme tokenuntuk hak akses. Sub bab ini akan membahas mengenai implementasi menggunakan mekanismefactory, sebuah implementasi yang umum digunakan pada solusi berbasis container seperti Java.Kelebihan mekanisme factory adalah thread yang dikelola didalam factory, sering disebutObjectFactory. Mekanisme ini adalah dikarenakan mengakses sebuah sumber data sangatmemerlukan resource, dan sebaiknya dilakukan implementasi pooling, hal yang sama yang kitatemukan pada saat kita mengakses database dengan connection pooling.Tentu saja dengan mengetahui fitur factory didalam sebuah API, maka kita dapat mulaimenggunakan konsep yang sama untuk semua data source yang kita akan gunakan. Jadi tidak asalpakai saja.Untuk sub bab ini kita hanya membahas JSON API dari Jackson (http://jackson.codehaus.org),tetapi disubbab sebelumnya ada GSON dari Google, tetapi karena tidak ada fitur JSONFactory,maka kita mengimplementasikan Jackson.JSONFactory dari Jackson ada di org.codehaus.jackson.JsonFactory. Sedangkan implementasiuntuk session factorynya (istilah yang digunakan di Hibernate), adalahorg.codehaus.jackson.JsonGenerator.Didalam Jackson, terdapat JsonFactory adalah pabrik dari json di Jackson, sedangkanJsonGenerator untuk menulis Json, JsonParser untuk membaca. Ada satu obyek yaitu ObjectMapperyang digunakan untuk membinding Json. Sebuah gabungan dari JsonParser dan JsonGenerator?Nah ObjectMapper ini dapat dikatakan XML Bindingnya JSON. ObjectMapper ini akanmenggunakan JsonParser dan JsonGenerator dalam membentuk instan JSON.Mekanisme factory yang telah dijelaskan dan beberapa obyek yang hendak kita gunakan, akan kitaimplementasikan didalam ApplicationContext Spring, yang tertulis seperti ini. <bean id="jacksonObjectmapper" class="org.codehaus.jackson.map.ObjectMapper" /> <bean id="jacksonJsonFactory" class="org.codehaus.jackson.JsonFactory"> <constructor-arg index="0" ref="jacksonObjectmapper" /> </bean> <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"> <property name="objectMapper" ref="jacksonObjectmapper" /> </bean>Konfigurasi <bean> dapat dilihat di file ApplicationContext.xml didalam folder /src/resource. Yangmana dalam implementasinya akan dideploy di /WEB-INF/classes.Mengimplementasikan JsonFactory adalah dengan menambahkan @Autowired di class Service,dalam kasus buku ini adalah PersonServiceImpl, sebuah implementasi dari PersonService.Berikut adalah settingnya @Autowired private JsonFactory jsonFactory;Implementasi dari JsonFactory adalah dengan membuat view dari /person/{id}, sama dengan edityang telah diimplementasikan dibab MVC. Tentu saja model yang dibahas disini adalah
  • 15. mengkonsumsi JSON.Untuk menghasilkan JSON, berikut adalah contoh memproses JSON menjadi JSON diPersonJsonController, sebuah implementasi REST dengan JsonFactory.public String jsonGet() { try { HttpServletResponse response =ServletActionContext.getResponse(); response.setContentType("application/json"); response.setCharacterEncoding("UTF-8"); personService.writePersonAsJson(person.getId(), response.getWriter()); } catch (IOException e) { e.printStackTrace(); } return SUCCESS; }Adapun diagram kerja dituangkan dalam diagram berikutImplementasi JsonFactory ini bersamaan dengan HibernateFactory, sehingga dapat dikatakan kodedari sub bab ini adalah implementasi MVC dengan output JSON, dengan data source dari databasedan JSON.