請參見「JFinal教程1——小白的第一個JFinal程序」(http://my.oschina.net/u/1175852/blog/261235)中的相關章節,部署應用到Tomcat的步驟講得比較詳細。部署後結構以下圖:java
能夠看到,Consumer和Provider都依賴Api項目。數據庫
Consumer和Provider不管誰先啓動均可以,輸入URL後,能夠看到JFinal Demo原裝頁面了:架構
查看管制臺,Provider輸出了數據操做的SQL(ActiveRecordPlugin.setShowSql(true)),app
頁面和Provider都作出了指望的響應,整個Demo就此結束了嗎!實際卻不是,筆者在此處遇到好幾個問題,後面將這些問題和解決方案一一道來。ide
經過Provider服務的「/druid」action可打開Druid監控頁面:ui
即便能夠經過啓動類將Provider作爲通常Java應用啓動,但仍是將其建成Web項目,緣由就在於只有Web項目能夠打開Druid監控。對於開發者來講,Sql的執行效率數據頗有用。spa
在Demo運行起來後,對Blog進行建立和修改操做時出現了「Html 500」的錯誤,Consumer中報錯以下:.net
Blog列表功、建立和修改都沒有問題,惟獨保存功能出現異常。調試
經過調試,查到了問題的根源。在TableMapping中,與Blog表對應的Table數據中沒有字段信息。由於字段信息是在ActiveRecordPlugin啓動時經過TableBuilder從數據庫中獲取的。code
此問題在一年前向 @JFinal 提出過,問題地址爲:http://www.oschina.net/question/1175852_149042。
解決方案有3種:
1. 寫個API給Blog表手動添加字段信息,也就說Consumer和Provider所有采用Model交互。
2. 建立與Model對應的Java Bean,在Provider與數據庫打交道時經過反射在Model和Java Bean之間轉換,即採用Java Bean交互,但數據庫操做仍是使用ActiveRecordPlugin。
3. 放棄ActiveRecordPlugin,Consumer和Provider所有采用Java Bean交互。數據庫操做採用Hibernate或Ibatis等ORM。
以上方案各有利弊,筆者爲了修改量小,採用了第一種方案,即寫了個API手動添加Blog表的字段信息。
建立「com.jfinal.plugin.activerecord.TableInitKit.java」,名稱空間是「com.jfinal.plugin.activerecord」,便於訪問JFinal中TableMapping的保護方法putTable():
public final class TableInitKit { /** * 手動初始化Model對就的Table字段數據 * * @param tableName * 表名 * @param modelClass * model的Class * @param attrTypeMap * 字段類型Map */ public static void init(String tableName, Class<? extends Model<?>> modelClass, Map<String, Class<?>> attrTypeMap) { init(tableName, "id", modelClass, attrTypeMap); } /** * 手動初始化Model對就的Table字段數據 * * @param tableName * 表名 * @param primaryKey * 主鍵名 * @param modelClass * model的Class * @param attrTypeMap * 字段類型Map */ public static void init(String tableName, String primaryKey, Class<? extends Model<?>> modelClass, Map<String, Class<?>> attrTypeMapTypeMap) { Table blogTable = new Table(tableName, primaryKey, modelClass); blogTable.setColumnTypeMap(attrTypeMapTypeMap); TableMapping.me().putTable(blogTable); } }
在Config的DemoConsumerConfig.afterJFinalStart()方法中添加以下代碼:
@Override public void afterJFinalStart() { Map<String, Class<?>> blogColumnMap = new HashMap<String, Class<?>>(); blogColumnMap.put("id", Integer.class); blogColumnMap.put("title", String.class); blogColumnMap.put("content", String.class); TableInitKit.init("blog", Blog.class, blogColumnMap); System.out.println("Blog表字段模擬完成。"); System.out.println("Demo consumer for Dubbo啓動完成。"); }
重啓Consumer以後,保存功能正常。至此,初步功能和架構已經徹底能正常工做。
源碼地址:
Dubbo文檔:
系列文章: