1. 概述
本文主要提供了程式資料源在使用中遇到的問題以及解決方案。
2. 程式資料集載入慢或者卡死
原因分析:
沒有做初始化只執行一次的判斷
解決方案:
因為 getValueAt() 方法裏面呼叫了 init() 方法導致執行次數太多後台卡住預覽不了資料,正確修改如下:
public void init() {
// 確定只被執行一次
if (valueList != null) {
return;
}
3. 程式資料集獲取不到參數
原因分析:
獲取參數的API位置寫錯,未放到 int 初始化中
解決方案:
一般包含從資料源讀取資料,及後續的處理–從各種類型轉換成二維陣列,在 getRowCount() 和 getValueAt() 方法中被呼叫以獲取行數和值。例如:
public void init() {
// 確定只被執行一次
if (valueList != null) {
return;
// 獲取參數
String parameter0 = ((ParameterProvider) (parameters.get().toArray())[0]).getValue().toString();
}
4. 設計器使用程式資料集報錯缺少tools
原因分析:
程式運作時用到 tools 包,程式運作找不到此包
解決方案:
在 FineReport_11.0\lib 和 FineReport_11.0\webapps\webroot\WEB-INF\lib 底下都put 命令 tools 包。
5. 程式資料集預覽資料中文亂碼或者過濾無資料
原因分析:
資料庫編碼與設計器編碼不一致導致(優先保證程式碼單獨執行可以正常取數)
解決方案:
方案一:修改設計器的編碼,修改設計器啟動參數,在 %FR_HOME%bin\designer.vmoptions 檔案中新增參數:-Dfile.encoding=UTF-8
方案二:修改資料連結的編碼
6. 報錯:java.lang.NoClassDefFoundError
7. 報錯:Could not initialize class com.fr.web.Oldweblet
問題描述:
啟動工程,catalina.out列印出報錯Could not initialize class com.fr.web.Oldweblet,範本顯示空白。
原因分析:
版本升級或者版本不一致導致無法初始化類。
解決方案:
對於不同版本的FRAPI是有所變化的,修改對應程式碼重新編譯即可。
8. 報錯:Illegal character in path at index
問題描述:
參數重新整理不出來或者報錯 java.lang.IllegalArgumentException:Illegal character in path at index
原因分析:
1)因為程式資料集class裏自己定義了參數, 跟介面衝突, 出於相容原因, 優先選擇使用class裏設定的:。
2)遠端設計情況下本地沒有對應程式資料集。
解決方案:
1)刪掉程式資料集class裏的參數, 直接用介面上的. 程式碼中不去setParameter, 直接getParameter即可. (程式資料集介面參數需要手動新增,無法自動識別)
2)本地和伺服器上都要放class檔案。
9. 獲取不到程式資料集裏傳入的參數
問題描述:
Object[] paramArray = parameters.get().toArray();透過這種方式獲取參數,是個空陣列,結果獲取不到程式資料集裏傳入的參數
原因分析:
程式資料集獲取不到參數,編寫錯誤。
解決方案:
把獲取參數的API寫到int初始化中。
10. 程式資料集逾時後反覆呼叫
原因分析:
程式資料源逾時或者資料為空的時候,會控制台反覆呼叫,導致資料庫崩掉。
解決方案:
定義靜態變數並對每個方法做判斷初始化
11. 報錯:java.lang.reflect.UndeclaredThrowableException
問題描述:
設計器端一般報錯為:java.lang.reflect.UndeclaredThrowableException
設計器fanruan.log日誌裏面報錯:Caused by: java.io.NotSerializableException
原因分析:
程式資料集類的屬性存在不可序列化的屬性
解決方案:
一般是直接把不可序列化的屬性去掉,在取數方法裏面生成,或者加 transient修飾,被 transient 修飾的屬性代表不參與序列化,或者將屬性更換成可序列化的屬性。
12. 報錯:java.lang.ArrayIndexOutOfBoundsException
問題描述:
程式資料集預覽報錯:Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
原因分析:
程式資料集取數時手動新增的參數,
如果多於程式碼裏面使用的參數則正常
如果少於程式碼裏面使用的參數則會報錯陣列越界
解決方案:
程式資料集建立的參數數量應跟程式碼裏定義的參數一致