5. membuat aplikasi berbasis rest

download 5. membuat aplikasi berbasis rest

If you can't read please download the document

Transcript of 5. membuat aplikasi berbasis rest

Solusi Mengakses REST

Pengembangan Aplikasi MVC dengan REST

Mengacu pada kasus pada bab sebelumnya, maka dengan ini akan diteruskan kasus pengembangan yaitu menggunakan Person sebagai kasus. Berikut ini adalah implementasi dari PersonController dan PersonService. Jujur saja, kode dalam subbab ini adalah modifikasi kecil dari code contoh REST dari Struts2, yang mana kode ini yang menjadi acuan migrasi dari Cimande 1.x ke 2.x, dari kemampuan MVC biasa menjadi RESTful MVC.

Yang menarik dari kasus kecil ini adalah untuk mempelajari mekanisme bagaimana pengembangan REST dilakukan, serta bagaimana merubah sebuah action dengan result jsp menjadi sebuah json, yang siap digunakan sebagai metadata pengembangan berbasis service atau peningkatan kemampuan interoperabilitas. Yang mana semua hal ini akan menjadi sajian utama buku ini.

Sebuah proyek kecil s2-rest-showcase, yang mengimplementasikan sebuah POJO Person, yang terdiri dari Nama dan Amount, dengan implementasi PersonController untuk memetakan hasil proses dengan lapisan presentasi (JSP) serta PersonService yang memiliki beberapa method seperti getAll(), save(), remove(), dan get(). REST showcase ini kalau ditilik lebih lanjut memiliki beberapa kelemahan, oleh karena itu kami memodifikasinya dengan membuat CimandeActionMapper dan membuat implementasi JSON dengan Jackson. Yang mana semaunya akan dibahas dibab ini.

Bab ini akan dijelaskan dimulai dari aplikasi REST berjenis produser, dilanjutkan dengan implementasi dari REST yang ditelah dikembangkan menggunakan aplikasi Java sederhana. Semua dengan kasus obyek Person. Implementasi diakhir bab adalah implementasi REST aplikasi sederhana ini dikembangkan menjadi sebuah sumber data atau data source alternatif selain Hibernate. Sebuah pendekatan perubahaan data source dari database menjadi services menggunakan mengutilisasi mekanisme injection.

Aplikasi produser layanan REST pertama adalah yang merupakan sebuah Array, dilanjutkan dengan implementasi Cimande dan Yama berbasis REST yang menggunakan Hibernate sebagai data source.

Fitur REST sebenarnya sudah tertuang dalam bab sebelumnya, maklum sejak REST plugins direlease, aplikasi web dengan Struts2 otomatis menjadi REST, dan kami mencoba membuat versi SpringMVC dengan kodename Yama, ternyata hasilnya sama juga. Dengan ini pembuktian bahwa pengembangan aplikasi REST adalah tidak mengembangkan sistem baru seperti halnya SOA, adalah benar apa adanya. Sehingga aset yang telah ada, dapat dimigrasi ke RESTfull tanpa perlu investasi tim pengembang baru. Menarik bukan!.

Struts2 telah memiliki fitur otomatis merubah setiap presentation view bilamana kita telah menambahkan template, tetap metadata baik JSON ataupun XML, tetap dihasilkan, hanya dengan menambahkan .json atau .xml dikhir URI. Untuk kasus Cimande dalam buku ini, karena menggunakan 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 URL http://localhost:8080/cimande/person/result adalah sebagai berikut:

HTTP/1.1 200 OKDate: 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 yang disertakan dalam DVD buku ini.

Importlah kedalam Eclipse, dan jalankan. Akan langsung diredirect ke URL http://localhost:8080/S2ShowCase/persons. Sebuah hasil pencarian dihasilkan.

Harap memperhatikan source code yang ada disamping kiri, betul sekali. PersonController memilki banyak method, dan setiap method terhubung dengan file JSP yang berada di folder content dalam WebContent.

Setting method didalam PersonController adalah tanpa setting apapun, sehingga bilamana kita membuat satu method, misalnya makan, maka otomatis dibutuhkan persons-makan.jsp, sebagai template presentation layernya.

Contoh REST Show case adalah menggunakan Person, metode yang mirip yang dijelaskan dibab sebelumnya, tetapi showcase ini sangat baik untuk menjadi ajang pembelajaran, karena hanya menggunakan template dan action, tidak ada persistance, injection atau sejenisnya. Ini adalah sebuah 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 kasus bab sebelumnya. Berikut adalah desain UMLnya.

UML Person Showcase

Bandingkan dengan mekanisme bab sebelumnya, lebih mudah dan praktis bukan. Bilamana kita hendak mempoint method ke template yang kita tentukan, seperti konsep yang dijelaskan pada bab berikutnya. Tunggulah jawabannya, akan dijelaskan setelah ini.

Implementasi REST

Bab sebelumnya menjelaskan bagaimana sebuah controller, injection dan mengembangkan aplikasi MVC diatas sebuah integration framework. Pengembangan aplikasi MVC akan semakin mudah, bilamana integration frameworknya sangat terpadu dan modular. Contoh pengembangan aplikasi CRUD dengan kasus table pegawai telah dijelaskan. Proses berikutnya adalah mengembangkannya menjadi REST.

Bab ini diharapkan ada peningkatan pengembangan yaitu mengimplementasikan pattern DAO dan juga implementasi Service. Sebuah mekanisme yang memisahkan hubungan ke model dan membuat sebuah controller bersifat pelayanan.

Untuk memulainya hanya memerlukan mengimport code Cimande2 ke Eclipse WTP, dan menjalankannya dengan Tomcat (code jalan di Tomcat versi 6 maupun 7). Tetapi code dalam buku ini 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 dapat dengan membuka hibernate.cfg.xml.

Cobalah melakukan pengisian beberapa kali, dan jalankan URL berikut http://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 dirubah mengacu pada table yang baru. Upgrade otomatis, hebat sekali bukan.

Coba click Edit dan akan muncul sebuah form edit dengan URI /person/{id}, id yang dimaksud adalah 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 Hibrnate, informasi lebih lanjut mengenai generate id dapat melihat DefaultPersistance.

Yang menarik dari kode yang disertakan dibab sebelumnya dengan bab ini adalah implementasi Controller. Berikut adalah PersonController, dan setiap method yang dibuat mewakili satu action. Harap memperhatikan annonation yang ada, yaitu @Result, terdapat beberapa mekanisme implementasi yaitu velocity dan redirect, yang artinya action yang dijalankan menggunakan template engine velocity dan yang tidak ada presentasi result melakukan redirect ke action lainnya..

Menampilkan metadata JSON atau XML

Cimande

Yama

Mengkonsumsi layanan berbasis REST

Subbab ini akan mendalami bagaimana mengkonsumsi layanan yang dihasilkan dari aplikasi yang telah dikembangkan. Untuk mengimplementasikannya, tetap digunakan pendekatan CRUD, sehingga mekanismenya dapat digunakan menjadi aplikasi lain. Metode yang akan diterangkan akan terus berkelanjutan, dibab berikutnya akan digunakan dalam implementasi dalam lingkungan Android, sedangkan diakhir bab akan digunakan untuk menciptakan composite dashboard dengan Liferay. Impelementasi yang tidak dijelaskan dalam bab ini adalah mengkonsumsinya menggunakan Javascript, baik itu menggunakan ExtJS ataupun JQuery.

Secara konsep, mengkonsumsi REST adalah mirip dengan mekanisme menggunakan database sebagai sumber data, hanya jenisnya saja yang berubah dari database menjadi metadata baik itu XML atau JSON.

JSON digunakan karena implementasinya dapat langsung didalam browser, dan dikarenakan harus melakukan konversi XML ke JSON (Array Javascript), dan prosesnya membutuhkan resource, sehingga JSON diproses diserver. Implementasi ini malah menjadi kebablasan, sehingga aplikasi yang non browser juga ikut-ikutan mengimplementasikannya. Dan salah satu implementasinya yang kebablasan ini adalah buku ini, dimulai dari bab ini.

Implementasi dari aplikasi yang telah kita kembangkan, bilamana telah menjadi RESTful, adalah terdiri dari dua tipe, yaitu layanan yang public tanpa keamanan, dan layanan yang membutuhkan keamanan.

Layanan yang public yang umum adalah RSS dari blog, sedangkan layanan yang membutuhkan keamanan, digunakan umumnya untuk melindungi data, atau pemisahan konten sesuai dengan jenjang. Impelementasi data yang dengan keamanan yang sangat mudah dipahami adalah Flickr dengan Web APInya atau implementasi aplikasi Facebook.

Izin Mengakses REST pada Facebook yang menggunakan kunci keamanan

Mengkonsumsi REST publik

Dalam implementasi konsumsi layanan REST publik, sebenarnya kita hanya membutuhkan URI dari HTTP, dan kemudian hanya perlu mengimplementasikannya, mau GET atau POST. POST sebaiknya digabungkan dengan security lainnya, bilamana tidak, dijamin spammer akan menyerang secara dahsyat.

Sub area bab ini dijelaskan mengenai pengembangan aplikasi yang mengkonsumsi layanan REST berjenis JSON, adalah untuk pemahaman semata. Sebaiknya keamanan diimplementasikan. Wong dengan keamanan berlapis saja, bisa dijebol.

Diagram dibawah ini menjelaskan bagaimana melakukan pengkonsumsian dengan URI http://localhost:8080/person, dimana dalam implementasinya adalah http://localhost:8080/cimande/person, bilamana menggunakan Cimande, dan http://localhost:8080/yama/person, bilamana menggunakan Yama.

Mekanisme pengkonsumsian layanan REST

Berikut adalah sumber kode dari HTTPGetPerson, yang mengkonsumsi layanan REST, tetapi data yang dikembalikan hanya 1 data, data tersebut akan dikonversi menjadi obyek Person. Lebih jelasnya silahkan buka file HTTPGetPerson

package 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 theJSONString 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(). Dimana URI adalah sumber datanya, sedangkan sampleId adalah ID atau primary key dari data yang hendak kita tampilkan, sedangkan mapper.readValue() digunakan untuk mengkonversi JSON yang didapat dari server menjadi Person.class.

Berikut ini adalah bilamana hendak melakukan pengambilan data, tetapi data yang dikembalikan lebih dari satu data, dan bilamana dikonversi menjadi sebuah koleksi data, yang terdiri dari banyak obyek Person.

Kata kunci dari merubah JSON yang lebih dari satu data, menjadi sebuah koleksi adalah sebagai berikut:

public List getPersonsJackson(String json)throws JsonParseException, JsonMappingException, IOException {

TypeReference typeReference = new TypeReference() {};

List persons = mapper.readValue(json, typeReference);

return persons;}

TypeReference ini akan merubah JSON yang masuk menjadi ArrayList, yang mana persons yang direturn adalah List.

Metod getPersonsJackson() dikombinasikan dengan hasil dari HTTPreqeust, menjadi List dengan value 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 getPersonsJackson(String json)throws JsonParseException, JsonMappingException, IOException {

TypeReference typeReference = new TypeReference() {};

List persons = mapper.readValue(json, typeReference);

return persons;}

public List getPersonsGson(String json) {

Type listType = new TypeToken() {}.getType();

List persons = gson.fromJson(json, listType);

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 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)) {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 kita gunakan, adapun implementasinya dipecah menjadi 2 area, yaitu implementasi koleksi untuk masukan atau parameter, dan pengiriman parameter untuk ekskusi.

Berikut adalah implementasi koleksi masukan atau paramternya;

// Set request parameterList formparams = new ArrayList();formparams.add(new BasicNameValuePair("username", "dianw"));formparams.add(new BasicNameValuePair("password", "dianw"));formparams.add(new BasicNameValuePair("firstName", "Dian"));formparams.add(new BasicNameValuePair("lastName", "Aditya"));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 tanpa keamanan, termasuk juga mengirim atau memasukan data ke dalam REST server. Mekanisme itu adalah sangat tidak aman dan sangat mudah diserang spammer, khususnya yang POST.

Untuk mengimplementasikan security, diperlukan seperti layanan tambahan untuk memproses dan mengola data yang berjenis keamanan, yang notabene umumnya berhubungan dengan user, password atau sejenisnya.

Berikut adalah UML dari implementasi token interceptor yang bertugas mengfilter setiap request REST.

Diagram UML Implementasi Keamanan dengan Token

Implementasi token keamanan didalam lingkungan REST adalah sangat penting, sebab jenis transaksi REST adalah state less, yang berarti setiap request dengan request lainnya tidak saling berhubungan. Berbeda dengan implementasi pada browser, yang ditahan adalah sessionnya, yang akan jatuh tempo setelah 20 menit umumnya, dimana saat itu diperlukan login kembali.

Lingkungan REST yang statefull memerlukan identifikasi sendiri untuk membuat setiap request memiliki keterkaitan.

Implementasi UML diatas adalah sama dan mirip dengan implementasi Person, yang telah dibahas dibab sebelumnya, dimana ditemukan Controller, Service dan Model. Yang membedakan adalah implementasinya tidak menjadi View baik itu HTML atau JSON ataupun XML, melainkan digabungkan kedalam interceptor. Kalau diperhatikan didalam kode sumber Cimande, ada 2 implementasi interceptor, untuk memproses .jackson yang merupakan plugin Strut2 dan implementasi token ini.

Banyaknya interceptor adalah tidak dibatasi, dan tentu saja berhubungan langsung dengan performansi 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 token

URI dari token adalah /login, artinya implementasi dari UserController. Berikut adalah annonation dari 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, hanya mengimplementasikan UUID.randomUUID().

user.setSecret(UUID.randomUUID().toString());

Sedangkan untuk menggunakannya adalah dengan implementasi seperti ini

URI uri = URIUtils.createURI(scheme, host, port, contextPath+ "/person/" + sampleId + "/edit.jackson", "key=" + secret, null);

Dimana key yang dimasukan akan diproses bukan oleh PersonController, tetapi oleh ServiceInterceptor.

if (request.getParameter("key") != null) {User user = service.getBySecret(request.getParameter("key"));if (user != null) {return invocation.invoke();}}

Key ini adalah pintu untuk memperbolehkan mengambil data Person, dan PersonController akan diproses.

Berikut adalah diagram untuk menjelaskan proses pengambilan obyek Person yang lebih dari satu.

Implementasi mengambil data dari server REST dengan mekanisme token

Berikut adalah implementasi dari kode yang telah dijelaskan diawal bab ini tetapi menggunakan token, untuk lebih lengkapnya silahkan melihat kode sumber bab ini.

GetPersonWithToken:

HttpClient client = new DefaultHttpClient();HttpResponse response = null;

String theJSON = "";

// Get secret keyString 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 keyString 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 theJSONString theJSON = EntityUtils.toString(response.getEntity());

Bekerja dengan JSONFactory

Telah dijelaskan pada sub bab diatas, mengenai bagaimana mengkonsumsi sebuah layanan berbasis REST dengan output JSON, baik layanan publik tanpa hak akses ataupun dengan mekanisme token untuk hak akses. Sub bab ini akan membahas mengenai implementasi menggunakan mekanisme factory, sebuah implementasi yang umum digunakan pada solusi berbasis container seperti Java.

Kelebihan mekanisme factory adalah thread yang dikelola didalam factory, sering disebut ObjectFactory. Mekanisme ini adalah dikarenakan mengakses sebuah sumber data sangat memerlukan resource, dan sebaiknya dilakukan implementasi pooling, hal yang sama yang kita temukan pada saat kita mengakses database dengan connection pooling.

Tentu saja dengan mengetahui fitur factory didalam sebuah API, maka kita dapat mulai menggunakan konsep yang sama untuk semua data source yang kita akan gunakan. Jadi tidak asal pakai 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 implementasi untuk session factorynya (istilah yang digunakan di Hibernate), adalah org.codehaus.jackson.JsonGenerator.

Didalam Jackson, terdapat JsonFactory adalah pabrik dari json di Jackson, sedangkan JsonGenerator untuk menulis Json, JsonParser untuk membaca. Ada satu obyek yaitu ObjectMapper yang digunakan untuk membinding Json. Sebuah gabungan dari JsonParser dan JsonGenerator? Nah ObjectMapper ini dapat dikatakan XML Bindingnya JSON. ObjectMapper ini akan menggunakan JsonParser dan JsonGenerator dalam membentuk instan JSON.

Mekanisme factory yang telah dijelaskan dan beberapa obyek yang hendak kita gunakan, akan kita implementasikan didalam ApplicationContext Spring, yang tertulis seperti ini.

Konfigurasi dapat dilihat di file ApplicationContext.xml didalam folder /src/resource. Yang mana 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

@Autowiredprivate JsonFactory jsonFactory;

Implementasi dari JsonFactory adalah dengan membuat view dari /person/{id}, sama dengan edit yang telah diimplementasikan dibab MVC. Tentu saja model yang dibahas disini adalah mengkonsumsi JSON.

Untuk menghasilkan JSON, berikut adalah contoh memproses JSON menjadi JSON di PersonJsonController, 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 berikut

Implementasi JsonFactory ini bersamaan dengan HibernateFactory, sehingga dapat dikatakan kode dari sub bab ini adalah implementasi MVC dengan output JSON, dengan data source dari database dan JSON.