摘要:官網(wǎng)地址是用于幫助開發(fā)者更容易使用而開發(fā)的的插件官方地址本文代碼已開源在教程目標(biāo)教會(huì)大家基于開發(fā)一個(gè)簡(jiǎn)單的增刪查改應(yīng)用。就這樣一個(gè)簡(jiǎn)單的待辦事項(xiàng)就完成了呢
簡(jiǎn)介
ICEREST是一個(gè)非常輕量級(jí)只有200k左右的RESTful路由框架,通過ICEREST你可以處理url的解析,數(shù)據(jù)的封裝,Json的輸出,和傳統(tǒng)的方法融合,請(qǐng)求的參數(shù)便是方法的參數(shù),方法的返回值便是請(qǐng)求的返回值,同時(shí)我們希望ICEREST是一個(gè)能讓人倍感呵護(hù)的框架。
官網(wǎng)地址:http://icerest.cc
MongoDB-Plugin是用于幫助JAVA開發(fā)者更容易使用MongoDB而開發(fā)的的插件
官方地址:https://github.com/T-baby/Mon...
本文代碼已開源在GitHub:https://github.com/T-baby/ICE...
教程目標(biāo):教會(huì)大家基于ICEREST+MongoDB-Plugin開發(fā)一個(gè)簡(jiǎn)單的增刪查改應(yīng)用。
首先我們來看下這個(gè)demo的文件結(jié)構(gòu)
相信大家一眼就能看出這是一個(gè)maven項(xiàng)目,在component文件夾中包含了兩個(gè)驗(yàn)證器、一個(gè)bean類、一個(gè)model類。
首選我們?yōu)檫@個(gè)項(xiàng)目添加好依賴,在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,其他全局配置會(huì)自動(dòng)讀取根目錄下的application.properties文件,建議用默認(rèn) */ public void configConstant(ConstantLoader constantLoader) { //通過后綴來返回不同的數(shù)據(jù)類型 你可以自定義自己的 render,一般無(wú)需配置 //如:public class FreemarkerRender extends Render{} //目前支持json,text,file三種輸出 //constantLoader.addRender("ftl", new FreemarkerRender()); constantLoader.setDefaultForward("/"); //單頁(yè)應(yīng)用會(huì)用到,用來跳過對(duì)/的攔截 } /** * Config resource * 配置Resource路由的掃描目錄,ICEREST是自動(dòng)綁定路由的 */ 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. * 全局?jǐn)r截,會(huì)在進(jìn)入路由后,執(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 * 全局的攔截,會(huì)在進(jìn)入路由前執(zhí)行 */ public void configHandler(HandlerLoader handlerLoader) { //跨域 handlerLoader.add(new CORSHandler("GET,POST,PUT,DELETE")); } /** * Call back after ICEREST start */ public void afterStart() { //ICEREST啟動(dòng)前執(zhí)行的操作 } /** * Call back before ICEREST stop */ public void beforeStop() { //ICEREST停止前執(zhí)行的操作 } }
config這里沒有什么好說的,基本都已經(jīng)寫在了代碼的注釋。
我們現(xiàn)在羅列下我們需要開發(fā)的功能,我們要開發(fā)的是一個(gè)記錄待辦事項(xiàng)的工具要實(shí)現(xiàn)以下功能:
增加事項(xiàng)
刪除事項(xiàng)
修改事項(xiàng)
獲取所有事項(xiàng)
一個(gè)事項(xiàng)中包含了id、內(nèi)容和創(chuàng)建時(shí)間。所以我們可以建一個(gè)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類呢?在實(shí)際開發(fā)中經(jīng)常會(huì)有同時(shí)數(shù)個(gè)人開發(fā)同一個(gè)項(xiàng)目,mongodb允許每一行的結(jié)構(gòu)都不一樣但這對(duì)于協(xié)同開發(fā)來說缺是噩夢(mèng)。
所以為了方便協(xié)同工作建議使用bean類來約束數(shù)據(jù)的結(jié)構(gòu)。
相信大家會(huì)看到@NotNull這樣的注釋,有什么用呢?在Mongodb Plugin 1.0.5后已經(jīng)結(jié)合了hibernate的校驗(yàn)功能,遵循JSR 303規(guī)范。
具體使用見:http://www.cybermkd.com/mongo...
如果bean繼承了MongoValidate這個(gè)類,就可以在創(chuàng)建bean對(duì)象的后用validation方法校驗(yàn)全部屬性或者用validation(String... keys)校驗(yàn)?zāi)硞€(gè)屬性。通過errorMessage獲取錯(cuò)誤信息。
之所以沒命名為getErrorMessage是因?yàn)閒astjson在反序列化的時(shí)候會(huì)自動(dòng)處理帶有g(shù)etXXX的方法的變量。我們實(shí)際使用中又不需要errorMessage。
緊接著我們需要?jiǎng)?chuàng)建一個(gè)Model來操作數(shù)據(jù)庫(kù)。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); //以免萬(wàn)一清空id return new MongoQuery().use(collectionName).set(bean).save() > 0; } public boolean put(ItemBean bean) { MongoQuery query = new MongoQuery().use(collectionName).byId(bean.getId()); /*因?yàn)樵赾ontroller是直接獲取整個(gè)對(duì)象的(在查詢的時(shí)候?yàn)榱舜蠹曳奖銜?huì)自動(dòng)將_id變?yōu)閕d,但是mongodb實(shí)際存的還是_id), / 為了避免將id插入進(jìn)去,特意清空。*/ 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ù)了,在插入事項(xiàng)的時(shí)候我們需要校驗(yàn)內(nèi)容的長(zhǎng)度,當(dāng)刪除、更新的時(shí)候我們需要校驗(yàn)這個(gè)事項(xiàng)是否存在,所以我們需要分別建兩個(gè)校驗(yàn)器:
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的校驗(yàn)功能,可以直接在攔截器中用new ValidResult().mongoValid(對(duì)象,屬性名)校驗(yàn),如果不加后面的屬性名則是校驗(yàn)所有屬性。通過params.getObject就可以將獲取到的參數(shù)直接轉(zhuǎn)為某個(gè)對(duì)象,這個(gè)對(duì)象屬性中沒有的值全部拋棄。
在bean中的message注釋的文本,如果在校驗(yàn)器中校驗(yàn)發(fā)現(xiàn)傳的值是有問題的就會(huì)將這個(gè)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中相信大家會(huì)發(fā)現(xiàn)一個(gè)try catch,在mongodb java driver中如果傳來的id是隨便亂寫的那么會(huì)報(bào)錯(cuò),我們利用這一點(diǎn)建個(gè)try catch攔截錯(cuò)誤,只要mongodb driver 拋出錯(cuò)誤就代表id是錯(cuò)的。
@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等注釋聲明請(qǐng)求類型。用render封裝了下返回的結(jié)果。
就這樣一個(gè)簡(jiǎn)單的待辦事項(xiàng)api就完成了呢~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65050.html
摘要:官網(wǎng)地址是用于幫助開發(fā)者更容易使用而開發(fā)的的插件官方地址本文代碼已開源在教程目標(biāo)教會(huì)大家基于開發(fā)一個(gè)簡(jiǎn)單的增刪查改應(yīng)用。就這樣一個(gè)簡(jiǎn)單的待辦事項(xiàng)就完成了呢 簡(jiǎn)介 ICEREST是一個(gè)非常輕量級(jí)只有200k左右的RESTful路由框架,通過ICEREST你可以處理url的解析,數(shù)據(jù)的封裝,Json的輸出,和傳統(tǒng)的方法融合,請(qǐng)求的參數(shù)便是方法的參數(shù),方法的返回值便是請(qǐng)求的返回值,同時(shí)我們希...
摘要:菜鳥教程框架中文手冊(cè)入門目標(biāo)使用搭建通過對(duì)數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡(jiǎn)單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計(jì)指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊(cè)入門目標(biāo)使用搭建通過對(duì)數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡(jiǎn)單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計(jì)指南 RESTful API指南 依賴注入 D...
摘要:菜鳥教程框架中文手冊(cè)入門目標(biāo)使用搭建通過對(duì)數(shù)據(jù)增刪查改沒了純粹占行用的拜 后端API入門學(xué)習(xí)指北 了解一下一下概念. RESTful API標(biāo)準(zhǔn)] 所有的API都遵循[RESTful API標(biāo)準(zhǔn)]. 建議大家都簡(jiǎn)單了解一下HTTP協(xié)議和RESTful API相關(guān)資料. 阮一峰:理解RESTful架構(gòu) 阮一峰:RESTful API 設(shè)計(jì)指南 RESTful API指南 依賴注入 D...
摘要:如圖連接成功后,顯示你的數(shù)據(jù)庫(kù),在這個(gè)節(jié)目可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。如圖安裝與加載首先假定你已經(jīng)安裝了,命令行工具輸入在使用的文件中即可。創(chuàng)建讀取更新刪除單值讀取上文是在中基于對(duì)進(jìn)行增刪查改操作的簡(jiǎn)單介紹,以后會(huì)有進(jìn)階的文章。 關(guān)鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...
閱讀 2138·2021-11-11 16:55
閱讀 3202·2021-10-11 10:58
閱讀 3146·2021-09-13 10:28
閱讀 4084·2021-07-26 23:57
閱讀 1073·2019-08-30 15:56
閱讀 1364·2019-08-29 13:15
閱讀 1297·2019-08-26 18:18
閱讀 1311·2019-08-26 13:44