今天中午接到一個小需求:一訂單系統的小夥伴需要訪問我產品中心的一個表,那鐵定不能直接讀我PC(產品中心)的表啊,於是乎我需要寫一個hessian接口給他。一頓神操作,不到十分鐘,接口完成,如下所示:
//java bean
public class LogisticsLanguagesTrackingUrl{
int logistics_id;
int languages_id;
String pc_url;
String mobile_url;
String app_url;
...省略set,get,toString方法
}
//接口
public List<LogisticsLanguagesTrackingUrl> getLogisticsLanguagesTrackingUrlByLoidAndLaid(Integer loId, Integer laId);
//實現
@Override
public List<LogisticsLanguagesTrackingUrl> getLogisticsLanguagesTrackingUrlByLoidAndLaid(Integer loId, Integer laId) throws Exception {
return productsManager.getLLTU(loId,laId);
}
public List<LogisticsLanguagesTrackingUrl> getLLTU(int lo,int la) throws Exception {
return productsDao.getLLTU(lo,la);
}
public List<LogisticsLanguagesTrackingUrl> getLLTU(int lo, int la) throws Exception {
return mapper.getLogisticsLanguagesTBL(lo,la);
}
<select id="getLogisticsLanguagesTBL" resultType="com.litb.pc.common.entity.bean.resource.LogisticsLanguagesTrackingUrl">
select * from logistics_languages_tracking_url
where logistics_id = #{loId}
and languages_id = #{laId};
</select>
一切都是那麼的自然與隨意。接下來就是幹什麼呢?測試?不存在的!直接在羣裏大吼一聲,開發好了,並@訂單的小夥伴。
過了大約一分鐘吧,訂單的小夥伴發回我一串包錯信息並附加一個微笑的表情。
com.caucho.hessian.client.HessianConnectionException: 500: java.io.IOException: Server returned HTTP response code: 500 for URL: http://xxx:8083/products.api
at com.caucho.hessian.client.HessianProxy.invoke(HessianProxy.java:197)
at com.sun.proxy.$Proxy2.getLogisticsLanguagesTrackingUrlByLoidAndLaid(Unknown Source)
心想這還不簡單嗎,這不是500了嗎,這不是鏈接異常了嗎,那鐵定是項目沒有部署好唄。再次一頓神操作,依然報同樣的錯。此時已經意識到事情沒有這麼簡單,先查看整體流程,發現沒毛病,然後跟蹤代碼發現已調用mapper方法,返回Javabean的時候就報錯,此時已經百思不得其解,這數據庫和hessian鏈接有啥關係。
然後開始了漫長的查找錯誤的過程。。。。。
沒查到,上個廁所,梳理一下hessian原理。突然恍然大悟,是不是我的Javabean沒有序列化,回來一看,果然如此。
改成如下:
public class LogisticsLanguagesTrackingUrl implements Serializable {
int logistics_id;
int languages_id;
String pc_url;
String mobile_url;
String app_url;
}
測試通過,一切正常 。
所以說這個原理是有用的,但是隻懂原理不實踐是屁用沒有的,因爲你實踐的時候不一定能想到原理這檔子事。