O2OA開發日志(報錯總結)
提示:記錄學習O2OA中遇到的大大小小的問題
文章目錄
- O2OA開發日志(報錯總結)
- 一、學習記錄
-
- 1. 正常三步驟
- 2. 架構結構分析
- 3. 學習factory中的jap查詢
- 4. 插入資料
- 5. Wi與Wo
- 5. 實體類
- 6. 多子產品怎麼實作的?
- 7. 新增一個完整的實體(增删改查)
-
- com.x.yxapp.core.entity包
- com.x.yxapp.assemble.control
- 8. 為一個實體添加功能接口
- 二、報錯:加入新的jar和war後,無法啟動伺服器
-
- 問題描述:
- 原因分析:
- 解決方案:
- 三、報錯:調用get方法,出現空指針異常
-
- 問題描述:
- 原因分析:
- 解決方案:
- 四、報錯:不影響程式在伺服器的運作
-
- 問題描述:
- 原因分析:
- 解決方案:
- 五、報錯:
-
- 問題描述:
- 原因分析:
- 解決方案:
- 六、報錯:
-
- 問題描述:
- 原因分析:
- 解決方案:
- 七、報錯:
-
- 問題描述:
- 原因分析:
- 解決方案:
一、學習記錄
1. 正常三步驟
- 了解需求,學習相關技術
- 代碼實作,得到正常步驟
- 提取相同點和不同點,制作代碼生成器
2. 架構結構分析
控制層
一個檔案夾對應一張表
這個裡面就是對資料庫的增删改查
在idea中運作debug,進行遠端調試
實體類Student
Student類的标準元模型類的名字是 Student_
3. 學習factory中的jap查詢
-
EntityManager
EntityManager是JPA中用于增删改查的接口,它的作用相當于一座橋梁,連接配接記憶體中的java對象和資料庫的資料存儲。
-
CriteriaBuilder
CriteriaBuilder是一個工廠類,是一個工廠對象,安全查詢的開始,用于建構JPA安全查詢,用來建立安全查詢的criteriaQuery對象。
-
CriteriaQuery
CriteriaQuery 安全查詢主語句,該對象是用來建構查詢的。
-
Root
Root 定義查詢的From子句中能出現的類型
-
Predicate
Predicate查詢條件的拼接對應于where後面的添加表達式。
- 舉例說明
4. 插入資料
- save方法對資料庫的插入操作比較直接,立刻生成insert語句将對象插入資料庫,并傳回主鍵值;
- persist方法則會延遲插入資料,且沒有傳回值。persist在事務外部被調用時,不會觸發insert語句。在事務内和save方法類似。
protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement ) throws Exception {
ActionResult<Wo> result = new ActionResult<>();
Wi wi = this.convertToWrapIn( jsonElement, Wi.class );
if( StringUtils.isEmpty( wi.getName() )) {
throw new ExceptionStudentEntityClassNameEmpty();
}
try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
Student student = Wi.copier.copy( wi );
//啟動事務
emc.beginTransaction( Student.class );
//校驗并持久化對象
emc.persist(student, CheckPersistType.all );
//送出事務
emc.commit();
Wo wo = new Wo(student.getId());
result.setData(wo);
}
return result;
}
5. Wi與Wo
/**
* 用于接受前端傳入的對象型參數的幫助類
*
*/
public static class Wi extends Student {
public static WrapCopier<Wi, Student> copier = WrapCopierFactory.wi( Wi.class, Student.class, null, JpaObject.FieldsUnmodify );
}
/**
* 用于輸出響應内容的幫助類
*
*/
public static class Wo extends WoId {
public Wo( String id ) {
setId( id );
}
}
5. 實體類
簡單說明一下注解的作用
varchar(50)(可以為空)
public static final String name_FIELDNAME = "name";
@FieldDescribe("檔案名稱.")
@Column(length = length_255B, name = ColumnNamePrefix + name_FIELDNAME)
@Index(name = TABLE + IndexNameMiddle + name_FIELDNAME)
@CheckPersist(allowEmpty = false)
private String name;
char(1)
// `kslb` char(1) DEFAULT NULL COMMENT '考生類别碼',
public static final String kslb_FIELDNAME = "kslb";
@FieldDescribe("畢業類别碼.")
@Column(length = length_2B, name = ColumnNamePrefix + kslb_FIELDNAME)
@Index(name = TABLE + IndexNameMiddle + kslb_FIELDNAME)
@CheckPersist(allowEmpty = true)
private String kslb;
datatime(可以為空)
public static final String actualCompletedTime_FIELDNAME = "actualCompletedTime";
@FieldDescribe("實際結束時間.")
@Temporal(TemporalType.TIME)
@Column(name = ColumnNamePrefix + actualCompletedTime_FIELDNAME)
@Index(name = TABLE + IndexNameMiddle + actualCompletedTime_FIELDNAME)
@CheckPersist(allowEmpty = true)
private Date actualCompletedTime;
boolean(可以為空)
public static final String manualCompleted_FIELDNAME = "manualCompleted";
@FieldDescribe("會議是否手工結束")
@Column(name = ColumnNamePrefix + manualCompleted_FIELDNAME)
@Index(name = TABLE + IndexNameMiddle + manualCompleted_FIELDNAME)
@CheckPersist(allowEmpty = true)
private Boolean manualCompleted;
Double(可以為空)
public static final String price_FIELDNAME = "price";
@FieldDescribe("價格.")
@Column(name = ColumnNamePrefix + price_FIELDNAME)
@CheckPersist(allowEmpty = true)
private Double price;
Integer
public static final String commentCount_FIELDNAME = "commentCount";
@FieldDescribe("評論數")
@Column(name = ColumnNamePrefix + commentCount_FIELDNAME)
@Index(name = TABLE + IndexNameMiddle + commentCount_FIELDNAME)
private Integer commentCount;
ID
public static final String application_FIELDNAME = "application";
@FieldDescribe("歸屬應用ID.")
@Column(length = JpaObject.length_id, name = ColumnNamePrefix + application_FIELDNAME)
@Index(name = TABLE + IndexNameMiddle + application_FIELDNAME)
@CheckPersist(allowEmpty = false)
private String application;
6. 多子產品怎麼實作的?
我的第一個猜想應該是這裡進行部署
好家夥,結果是這樣的
基于這個報錯資訊,我又有了新的猜測
果然是這個我的路徑忘了修改才導緻兩個Action的路徑沖突了!!!它終于出現了!!!!
7. 新增一個完整的實體(增删改查)
我采用一個預報到資訊表(yx_new_student),進行示範說明
com.x.yxapp.core.entity包
-
編寫entity類:YxNewStudent
自動生成serialVersionUID
編寫每個字段(聽說text類型有注解來表示?)
生成每個字段的 getter() 和 setter()
- 在PersistenceProperties中添加類:YxNewStudent
public static class YxNewStudent {
public static final String table = "YX_NEW_STUDENT";
}
- com.x.yxapp.core.entity包中的操作就是這些,至于 YxNewStudent_ 檔案是編譯之後生成的,無須我們手動添加
com.x.yxapp.assemble.control
- 在com.x.yxapp.assemble.control 包中的 jaxrs包 中建立一個檔案夾yxnewstudent ,然後将同級工程模闆中的代碼 copy 到 新檔案夾yxnewstudent
- 修改 yxnewstudent 包中的異常類,并且自動生成serialVersionUID
- 在YxNewStudentAction中需要修改 path 路徑,否則就會造成路徑沖突進而産生bug
- 打開Action類 ,按下 ctrl + r 打開替換視窗 把 檔案 的實體類都替換為YxNewStudent 替換之後會有一個 小錯誤,隻需要新增一個YxNewStudentFactory類。
- 新增一個YxNewStudentFactory類,打開一個其他的Factory類,copy裡面的内容到YxNewStudentFactory中再進行替換就行,完成後發現business這裡調用方法有錯誤, 這裡就需要在Business類中添加如下代碼 上一個報錯解決了,發現這裡也缺少了類這個就是我們上一個講的會自動生成的YxNewStudent_ 現在我們把項目編譯一下 mvn install 稍待片刻之後,顯示BUILD SUCCESS 就表示成功啦!!! 打開 com.x.yxapp.core.entity 裡面就會有剛剛編譯生成的 YxNewStudent_ ,上面的報錯也得到了解決
- 在x_yxapp_assemble_control類的 containerEntities字元串數組 中 添加 對實體類的引用
- 在ActionApplication類中新增代碼,為了向外提供服務
- 最後再 執行 mvn install,生成 jar 和 war 會在store中,部署到伺服器就OK啦!!!
8. 為一個實體添加功能接口
二、報錯:加入新的jar和war後,無法啟動伺服器
問題描述:
加入新的jar和war後,無法啟動伺服器
重新開機伺服器報錯
就把工程模闆一模一樣的整上去,都可以部署成功
重新開機還是報空指針異常
原因分析:
終于解決了(但是我覺得這不是根本的原因,因為我也有部署成功後,重新開機還是報錯的情況,這裡讓我想起一個細節:之前我都是用stop指令停止服務,後面我就采用exit指令了,不知道是不是因為這個呢。)
解決方案:
部署一直報錯原來是因為順序問題,但是空指針錯誤是因為什麼呢?
三、報錯:調用get方法,出現空指針異常
問題描述:
原因分析:
工程模闆中有部分代碼功能未使用,導緻報空指針異常
解決方案:
注釋掉不需要的内容
四、報錯:不影響程式在伺服器的運作
問題描述:
怎麼說呢,這個是我在檢視代碼邏輯的時候發現的,
毛病就是這樣一步一步引出來的
原因分析:
我目測是因為構造函數的參數不符合條件導緻的問題,至于為什麼運作沒有報錯,就不得而知了。
解決方案:
暫時沒有解決
五、報錯:
問題描述:
pow檔案中的project一直報錯
原因分析:
‘parent.relativePath’ of POM o2oa:o2oa_custom:6.2 (D:\SpringBoo\xgapp\yxapp\pom.xml) points at o2oa:o2oa_custom instead of o2oa:o2server, please verify your project structure
原來是因為外面還有一層pow檔案,導緻了指向存在問題,
解決方案:
這裡我直接删掉了最外層的pow檔案
六、報錯:
問題描述:
原因分析:
缺少檔案
解決方案:
修改這個檔案的名字,與子產品保持一緻
七、報錯:
問題描述:
原因分析:
根據報錯資訊的指引,我去自動生成了serialVersionUID
結果是問題還是沒有解決,我發現應該是另外一個serialVersionUID還沒有更改,再試一試!
好家夥還是錯的
會不會是沖突了,好吧,不是這個問題,然後又有了新的嘗試
依然沒有解決問題,進行修改,應該是還有沒修改完整的地方
算是解決了一半吧,應該是缺少另一個entity
其實之前就報過這個錯,但是我的關注點錯誤了,導緻一直沒有找到根本的原因
現在我把另一個entity添加到containerEntities中,看看是否能解決問題?
終于成功解決了這個問題!!!!問題就是出在x_yxapp_assemble_control這個類中
抓住一個小細節,ksh這個字段為啥不在了?好家夥,繼續尋找問題
經過對比後發現,ActionGet這個接口中是存在ksh的,但是ActionListAll缺消失了,經過代碼對比分析後我更改了如下代碼:
ksh出現了!!!原來這個代碼可以隐藏字段!
解決方案:
将x_yxapp_assemble_control類中的内容補充完整。