摘要:官網(wǎng)地址是用于幫助開發(fā)者更容易使用而開發(fā)的的插件官方地址本文代碼已開源在教程目標教會大家基于開發(fā)一個簡單的增刪查改應(yīng)用。就這樣一個簡單的待辦事項就完成了呢
簡介
ICEREST是一個非常輕量級只有200k左右的RESTful路由框架,通過ICEREST你可以處理url的解析,數(shù)據(jù)的封裝,Json的輸出,和傳統(tǒng)的方法融合,請求的參數(shù)便是方法的參數(shù),方法的返回值便是請求的返回值,同時我們希望ICEREST是一個能讓人倍感呵護的框架。
官網(wǎng)地址:http://icerest.cc
MongoDB-Plugin是用于幫助JAVA開發(fā)者更容易使用MongoDB而開發(fā)的的插件
官方地址:https://github.com/T-baby/Mon...
本文代碼已開源在GitHub:https://github.com/T-baby/ICE...
教程目標:教會大家基于ICEREST+MongoDB-Plugin開發(fā)一個簡單的增刪查改應(yīng)用。
首先我們來看下這個demo的文件結(jié)構(gòu)
相信大家一眼就能看出這是一個maven項目,在component文件夾中包含了兩個驗證器、一個bean類、一個model類。
首選我們?yōu)檫@個項目添加好依賴,在pom.xml中添加。
junit junit 4.10 test ch.qos.logback logback-classic 1.1.2 com.alibaba fastjson 1.2.7 javax.servlet javax.servlet-api 3.1.0 com.cybermkd ICEREST 1.0.1.2 com.cybermkd ICEREST-PLUGIN 1.0.0 com.cybermkd MongodbPlugin 1.0.6.3
添加完以后在config文件夾中創(chuàng)建AppConfig類:
public class AppConfig extends Config { /** * Config constant * 配置常量,目前只能配置render,其他全局配置會自動讀取根目錄下的application.properties文件,建議用默認 */ public void configConstant(ConstantLoader constantLoader) { //通過后綴來返回不同的數(shù)據(jù)類型 你可以自定義自己的 render,一般無需配置 //如:public class FreemarkerRender extends Render{} //目前支持json,text,file三種輸出 //constantLoader.addRender("ftl", new FreemarkerRender()); constantLoader.setDefaultForward("/"); //單頁應(yīng)用會用到,用來跳過對/的攔截 } /** * Config resource * 配置Resource路由的掃描目錄,ICEREST是自動綁定路由的 */ public void configResource(ResourceLoader resourceLoader) { resourceLoader.addIncludePackages("com.cybermkd.component"); } /** * Config plugin * 配置插件 */ public void configPlugin(PluginLoader pluginLoader) { MongoIceRestPlugin mongoIcePlugin = new MongoIceRestPlugin(); mongoIcePlugin.add("127.0.0.1", 27017); mongoIcePlugin.setDatabase("item"); pluginLoader.add(mongoIcePlugin); } /** * Config interceptor applied to all actions. * 全局攔截,會在進入路由后,執(zhí)行方法前執(zhí)前 */ public void configInterceptor(InterceptorLoader interceptorLoader) { //權(quán)限攔截器 //interceptorLoader.add(new SecurityInterceptor(2, new MyAuthenticateService())); //Resource層事務(wù)的攔截器 @Transaction //interceptorLoader.add(new TransactionInterceptor()); } /** * Config handler * 全局的攔截,會在進入路由前執(zhí)行 */ public void configHandler(HandlerLoader handlerLoader) { //跨域 handlerLoader.add(new CORSHandler("GET,POST,PUT,DELETE")); } /** * Call back after ICEREST start */ public void afterStart() { //ICEREST啟動前執(zhí)行的操作 } /** * Call back before ICEREST stop */ public void beforeStop() { //ICEREST停止前執(zhí)行的操作 } }
config這里沒有什么好說的,基本都已經(jīng)寫在了代碼的注釋。
我們現(xiàn)在羅列下我們需要開發(fā)的功能,我們要開發(fā)的是一個記錄待辦事項的工具要實現(xiàn)以下功能:
增加事項
刪除事項
修改事項
獲取所有事項
一個事項中包含了id、內(nèi)容和創(chuàng)建時間。所以我們可以建一個bean類:
public class ItemBean extends MongoValidate { @NotNull(message = "content can"t be empty") @NotBlank(message = "content can"t be empty") @Length(min = 1, max = 120, message = "content is too long or too short") private String content; private String creat_time; @NotNull(message = "id can"t be empty") @NotBlank(message = "id can"t be empty") private String id; public String getContent() { return content; } public String getId() { return id; } public void setId(String id) { this.id = id; } public void setContent(String content) { this.content = content; } public String getCreat_time() { return creat_time; } public void setCreat_time(String creat_time) { this.creat_time = creat_time; } }
為什么我們使用者mongodb卻要要建bean類呢?在實際開發(fā)中經(jīng)常會有同時數(shù)個人開發(fā)同一個項目,mongodb允許每一行的結(jié)構(gòu)都不一樣但這對于協(xié)同開發(fā)來說缺是噩夢。
所以為了方便協(xié)同工作建議使用bean類來約束數(shù)據(jù)的結(jié)構(gòu)。
相信大家會看到@NotNull這樣的注釋,有什么用呢?在Mongodb Plugin 1.0.5后已經(jīng)結(jié)合了hibernate的校驗功能,遵循JSR 303規(guī)范。
具體使用見:http://www.cybermkd.com/mongo...
如果bean繼承了MongoValidate這個類,就可以在創(chuàng)建bean對象的后用validation方法校驗全部屬性或者用validation(String... keys)校驗?zāi)硞€屬性。通過errorMessage獲取錯誤信息。
之所以沒命名為getErrorMessage是因為fastjson在反序列化的時候會自動處理帶有g(shù)etXXX的方法的變量。我們實際使用中又不需要errorMessage。
緊接著我們需要創(chuàng)建一個Model來操作數(shù)據(jù)庫。MongoDB-Plugin的使用文檔見:http://www.cybermkd.com/mongo...
public class ItemModel { private static String collectionName = "storehouse"; public Listget() { return new MongoQuery().use(collectionName).findAll(); } public List get(String id) { return new MongoQuery().use(collectionName).byId(id).find(); } public boolean save(ItemBean bean) { System.out.println(JSON.toJSONString(bean)); bean.setId(null); //以免萬一清空id return new MongoQuery().use(collectionName).set(bean).save() > 0; } public boolean put(ItemBean bean) { MongoQuery query = new MongoQuery().use(collectionName).byId(bean.getId()); /*因為在controller是直接獲取整個對象的(在查詢的時候為了大家方便會自動將_id變?yōu)閕d,但是mongodb實際存的還是_id), / 為了避免將id插入進去,特意清空。*/ bean.setId(null); return query.modify(bean).update() > 0; } public boolean delete(ItemBean bean) { return new MongoQuery().use(collectionName).byId(bean.getId()).delete() > 0; } }
我們現(xiàn)在能操作數(shù)據(jù)了,在插入事項的時候我們需要校驗內(nèi)容的長度,當刪除、更新的時候我們需要校驗這個事項是否存在,所以我們需要分別建兩個校驗器:
public class ContentValidator extends Validator { @Override public ValidResult validate(Params params, RouteMatch routeMatch) { ItemBean item = params.getObject(ItemBean.class); return new ValidResult().mongoValid(item, "content"); } }
在ICEREST 1.0.1以上的版本已經(jīng)融入了MongoDB-Plugin的校驗功能,可以直接在攔截器中用new ValidResult().mongoValid(對象,屬性名)校驗,如果不加后面的屬性名則是校驗所有屬性。通過params.getObject就可以將獲取到的參數(shù)直接轉(zhuǎn)為某個對象,這個對象屬性中沒有的值全部拋棄。
在bean中的message注釋的文本,如果在校驗器中校驗發(fā)現(xiàn)傳的值是有問題的就會將這個message直接放入ValidResult中,格式如下:
{ "error":"", "errorMessage":"" }
public class IdValidator extends Validator { @Override public ValidResult validate(Params params, RouteMatch routeMatch) { ItemBean item = params.getObject(ItemBean.class); ValidResult result = new ValidResult(); result.mongoValid(item, "id"); if (result.isError()) { return result; } ItemModel m = new ItemModel(); try { if (m.get(params.get("id")).isEmpty()) { throw new RuntimeException(); } } catch (RuntimeException e) { result.addError("error", "100"); result.addError("errorMessage", "id is error."); } return result; } }
在IdValidator中相信大家會發(fā)現(xiàn)一個try catch,在mongodb java driver中如果傳來的id是隨便亂寫的那么會報錯,我們利用這一點建個try catch攔截錯誤,只要mongodb driver 拋出錯誤就代表id是錯的。
@API("/v1/item") public class ItemController extends Resource { ItemModel m = new ItemModel(); @GET() public WebResult get() { return render(m.get()); } @POST(valid = {ContentValidator.class}) public WebResult post() { ItemBean bean = getParams().getObject(ItemBean.class); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); bean.setCreat_time(df.format(new Date())); return render(m.save(bean)); } @PUT(valid = {IdValidator.class, ContentValidator.class}) public WebResult put() { return render(m.put(getParams().getObject(ItemBean.class))); } @DELETE(valid = {IdValidator.class}) public WebResult delete() { return render(m.delete(getParams().getObject(ItemBean.class))); } private WebResult render(Object obj) { JSONObject json = new JSONObject(); json.put("result", obj); return new WebResult(HttpStatus.OK, JSON.toJSONString(json)); } }
在controller類中,我們先利用@API聲明路徑,用@GET等注釋聲明請求類型。用render封裝了下返回的結(jié)果。
就這樣一個簡單的待辦事項api就完成了呢~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/18890.html
摘要:官網(wǎng)地址是用于幫助開發(fā)者更容易使用而開發(fā)的的插件官方地址本文代碼已開源在教程目標教會大家基于開發(fā)一個簡單的增刪查改應(yīng)用。就這樣一個簡單的待辦事項就完成了呢 簡介 ICEREST是一個非常輕量級只有200k左右的RESTful路由框架,通過ICEREST你可以處理url的解析,數(shù)據(jù)的封裝,Json的輸出,和傳統(tǒng)的方法融合,請求的參數(shù)便是方法的參數(shù),方法的返回值便是請求的返回值,同時我們希...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊入門目標使用搭建通過對數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學習指北 了解一下一下概念. RESTful API標準] 所有的API都遵循[RESTful API標準]. 建議大家都簡單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計指南 RESTful API指南 依賴注入 D...
摘要:如圖連接成功后,顯示你的數(shù)據(jù)庫,在這個節(jié)目可以對數(shù)據(jù)庫進行操作。如圖安裝與加載首先假定你已經(jīng)安裝了,命令行工具輸入在使用的文件中即可。創(chuàng)建讀取更新刪除單值讀取上文是在中基于對進行增刪查改操作的簡單介紹,以后會有進階的文章。 關(guān)鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...
閱讀 2894·2023-04-26 02:49
閱讀 3461·2021-11-25 09:43
閱讀 3437·2021-10-09 09:43
閱讀 3019·2021-09-28 09:44
閱讀 2461·2021-09-22 15:29
閱讀 4537·2021-09-14 18:02
閱讀 2794·2021-09-03 10:48
閱讀 3438·2019-08-30 12:47