2016-09-15 155 views
0

我們一直在使用Esproc和BIRT報告一段時間,並且一切正常。我們遵循this教程和事情的工作。但是,最新版本的軟件包含了一些新功能,因此我們現在需要升級使用BIRT運行的版本。現在的事情是,沒有任何工作。嘗試運行報告時,我們不斷收到NullPointerException。這是我們到目前爲止:將BIRT與Esproc集成

The following report will be sent to Eclipse: 

------ 
STATUS 
------ 
pluginId   org.eclipse.jface 
pluginVersion  3.12.0.v20160518-1929 
code    2 
severity   4 
message    Problems occurred when invoking code from plug-in: "org.eclipse.jface". 
fingerprint   eb22eddc61b2abbaef12193bb7441fab 

Exception:java.lang.NullPointerException: null 
    at com.esproc.jdbc.Server.getDfxList(Unknown Source:88) 
    at com.esproc.jdbc.InternalConnection.getMetaData(Unknown Source:314) 
    at org.eclipse.birt.report.data.oda.jdbc.ui.provider.JdbcMetaDataProvider.isSupportSchema(JdbcMetaDataProvider.java:305) 
    at org.eclipse.birt.report.data.oda.jdbc.ui.editors.SQLDataSetEditorPage.createDBMetaDataSelectionComposite(SQLDataSetEditorPage.java:405) 
    at org.eclipse.birt.report.data.oda.jdbc.ui.editors.SQLDataSetEditorPage.createPageControl(SQLDataSetEditorPage.java:334) 
    at org.eclipse.birt.report.data.oda.jdbc.ui.editors.SQLDataSetEditorPage.createPageCustomControl(SQLDataSetEditorPage.java:307) 
    at org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage.createControl(DataSetWizardPage.java:123) 
    at org.eclipse.datatools.connectivity.oda.design.internal.ui.DataSetEditorPageCore.createContents(DataSetEditorPageCore.java:74) 
    at org.eclipse.jface.preference.PreferencePage.createControl(PreferencePage.java:241) 
    at org.eclipse.birt.report.designer.data.ui.dataset.PropertyPageWrapper.createPageControl(PropertyPageWrapper.java:61) 
    at org.eclipse.birt.report.designer.data.ui.property.PropertyNode.createPageControl(PropertyNode.java:238) 
    at org.eclipse.birt.report.designer.data.ui.property.AbstractPropertyDialog.showPage(AbstractPropertyDialog.java:577) 
    at org.eclipse.birt.report.designer.data.ui.property.AbstractPropertyDialog.showSelectionPage(AbstractPropertyDialog.java:482) 
    at org.eclipse.birt.report.designer.data.ui.dataset.DataSetEditor.showSelectionPage(DataSetEditor.java:913) 
    at org.eclipse.birt.report.designer.data.ui.property.AbstractPropertyDialog$2$1.run(AbstractPropertyDialog.java:438) 
    at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) 
    at org.eclipse.birt.report.designer.data.ui.property.AbstractPropertyDialog$2.selectionChanged(AbstractPropertyDialog.java:433) 
    at org.eclipse.jface.viewers.Viewer$1.run(Viewer.java:158) 
    at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42) 
    at org.eclipse.ui.internal.JFaceUtil$1.run(JFaceUtil.java:50) 
    at org.eclipse.jface.util.SafeRunnable.run(SafeRunnable.java:173) 
    at org.eclipse.jface.viewers.Viewer.fireSelectionChanged(Viewer.java:155) 
    at org.eclipse.jface.viewers.StructuredViewer.updateSelection(StructuredViewer.java:2191) 
    at org.eclipse.jface.viewers.StructuredViewer.setSelection(StructuredViewer.java:1728) 
    at org.eclipse.jface.viewers.TreeViewer.setSelection(TreeViewer.java:1077) 
    at org.eclipse.jface.viewers.Viewer.setSelection(Viewer.java:383) 
    at org.eclipse.birt.report.designer.data.ui.property.AbstractPropertyDialog.initTreeSelection(AbstractPropertyDialog.java:408) 
    at org.eclipse.birt.report.designer.data.ui.property.AbstractPropertyDialog.createDialogArea(AbstractPropertyDialog.java:299) 
    at org.eclipse.birt.report.designer.data.ui.dataset.DataSetEditor.createDialogArea(DataSetEditor.java:124) 
    at org.eclipse.jface.dialogs.Dialog.createContents(Dialog.java:767) 
    at org.eclipse.birt.report.designer.data.ui.dataset.DataSetEditor.createContents(DataSetEditor.java:602) 
    at org.eclipse.jface.window.Window.create(Window.java:426) 
    at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1095) 
    at org.eclipse.birt.report.designer.ui.dialogs.BaseDialog.open(BaseDialog.java:107) 
    at org.eclipse.birt.report.designer.data.ui.actions.EditDataSetAction.doAction(EditDataSetAction.java:105) 
    at org.eclipse.birt.report.designer.internal.ui.views.actions.AbstractElementAction.run(AbstractElementAction.java:70) 
    at org.eclipse.jface.action.Action.runWithEvent(Action.java:473) 
    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:565) 
    at org.eclipse.jface.action.ActionContributionItem.lambda$4(ActionContributionItem.java:397) 
    at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) 
    at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4410) 
    at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1079) 
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4228) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3816) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) 
    at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022) 
    at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150) 
    at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:687) 
    at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336) 
    at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:604) 
    at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148) 
    at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138) 
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134) 
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388) 
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(null:-2) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(null:-1) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(null:-1) 
    at java.lang.reflect.Method.invoke(null:-1) 
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673) 
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610) 
    at org.eclipse.equinox.launcher.Main.run(Main.java:1519) 

------ 
REPORT 
------ 
anonymousId   12355fbc-cb0f-41c4-b330-1d4a60fd5df2 
name     
email    
comment    
eclipseBuildId  4.6.0.I20160606-1100 
eclipseProduct  org.eclipse.epp.package.reporting.product 
javaRuntimeVersion 1.8.0_71-b15 
osgiWs    win32 
osgiOs    Windows10 
osgiOsVersion  10.0.0 
osgiArch   x86_64 
severity   UNKNOWN 

------- 
BUNDLES 
------- 
name    org.eclipse.birt.report.data.oda.jdbc.ui 
version    4.6.0.v201606072122 

name    org.eclipse.birt.report.data.oda.jdbc 
version    4.6.0.v201606072122 

name    org.eclipse.birt 
version    4.6.0.v201606072122 

name    org.eclipse.birt.report.designer.ui 
version    4.6.0.v201606072122 

name    org.eclipse.birt.report.designer.ui.views 
version    4.6.0.v201606072122 

name    org.eclipse.core.databinding.observable 
version    1.6.0.v20160511-1747 

name    org.eclipse.core.databinding 
version    1.6.0.v20160412-0910 

name    org.eclipse.core.runtime 
version    3.12.0.v20160606-1342 

name    org.eclipse.datatools.connectivity.oda.design.ui 
version    3.3.0.201603142002 

name    org.eclipse.datatools.connectivity.oda.design 
version    3.4.0.201603142002 

name    org.eclipse.datatools.connectivity.oda 
version    3.5.0.201603142002 

name    org.eclipse.datatools.connectivity 
version    1.13.0.201603142002 

name    org.eclipse.e4.ui.workbench 
version    1.4.0.v20160517-1624 

name    org.eclipse.e4.ui.workbench.swt 
version    0.14.0.v20160523-1900 

name    org.eclipse.equinox.app 
version    1.3.400.v20150715-1528 

name    org.eclipse.equinox.launcher 
version    1.3.200.v20160318-1642 

name    org.eclipse.jface 
version    3.12.0.v20160518-1929 

name    org.eclipse.swt 
version    3.105.0.v20160603-0902 

name    org.eclipse.ui 
version    3.108.0.v20160518-1929 

name    org.eclipse.ui.ide.application 
version    1.1.100.v20160518-1929 

name    org.eclipse.ui.ide 
version    3.12.0.v20160601-1609 

任何人有任何想法是怎麼回事?

感謝

回答

0

好了,所以我能夠真正得到的東西的工作和解決的辦法是不正是我會打電話微不足道。實際上我不得不修改並重新編譯三個BIRT類。如果您不想執行Google搜索,則可以輕鬆獲取源代碼here。無論如何,我們的第一個修改是由上面引用的錯誤消息給我們的。我們需要修改位於org.eclipse.birt.report.data.oda.jdbc.ui_4.6.0.v201606072122.jar包中的JdbcMetaDataProvider.java。我們正在尋找的是isSupportSchema()方法。更具體地說這段代碼:

try 
{ 
    return connection.getMetaData().supportsSchemasInTableDefinitions(); 
} 
catch (SQLException e) 
{ 
    try 
    { 
     reconnect(); 
     return connection.getMetaData().supportsSchemasInTableDefinitions(); 
    } 
    catch (Exception e1) 
    { 
     try 
     { 
      ResultSet rs = connection.getMetaData().getSchemas(); 
      if(rs != null) 
       return true; 
      else 
       return false; 
     } 
     catch (SQLException e2) 
     { 
      logger.log(Level.WARNING, e.getMessage(), e1); 
      return false; 
     } 
    } 
} 

不通往Esproc的代碼,我不能確切說明爲什麼這樣做,但connection.getMetaData().supportsSchemasInTableDefinitions();拋出一個NullPointerException。如果沒有「catch」塊來處理所述異常,Eclipse將會停止執行並阻止您訪問您的數據集。因此,我們需要解決這個問題,像這樣:

try 
{ 
    return connection.getMetaData().supportsSchemasInTableDefinitions(); 
} 
catch (SQLException e) 
{ 
    try 
    { 
     reconnect(); 
     return connection.getMetaData().supportsSchemasInTableDefinitions(); 
    } 
    catch (Exception e1) 
    { 
     try 
     { 
      ResultSet rs = connection.getMetaData().getSchemas(); 
      if(rs != null) 
       return true; 
      else 
       return false; 
     } 
     catch (SQLException e2) 
     { 
      logger.log(Level.WARNING, e.getMessage(), e1); 
      return false; 
     } 
    } 
} 
catch (NullPointerException e) 
{ 
    return false; 
} 

那麼現在,下一個代碼兩位我們需要改變位於oda-jdbc.jar包。我們正在尋找的第一個是Connection.java類,更具體地說是方法populateConnectionProp()

private void populateConnectionProp() throws SQLException 
{ 
    if(jdbcConn!= null) 
    { 
     if(this.autoCommit != null) 
      jdbcConn.setAutoCommit(this.autoCommit); 
     else 
     { 
      if (DBConfig.getInstance().qualifyPolicy(
         jdbcConn.getMetaData().getDriverName(), 
         DBConfig.SET_COMMIT_TO_FALSE)) { 
       this.autoCommit = false; 
       jdbcConn.setAutoCommit(false); 
      } 
     } 
     if(this.isolationMode!= Constants.TRANSCATION_ISOLATION_DEFAULT) 
      jdbcConn.setTransactionIsolation(this.isolationMode); 
    } 
} 

這次的罪魁禍首扔NullPointerException是此行jdbcConn.getMetaData().getDriverName()。再次,沒有訪問Esproc的代碼,我不知道爲什麼試圖恢復驅動程序的名稱不起作用,但無論如何,我們所需要做的就是實際上趕上例外,事情將正常工作:

private void populateConnectionProp() throws SQLException 
{ 
    if(jdbcConn!= null) 
    { 
     if(this.autoCommit != null) 
      jdbcConn.setAutoCommit(this.autoCommit); 
     else 
     { 
      try 
      { 
       if (DBConfig.getInstance().qualifyPolicy(
          jdbcConn.getMetaData().getDriverName(), 
          DBConfig.SET_COMMIT_TO_FALSE)) { 
        this.autoCommit = false; 
        jdbcConn.setAutoCommit(false); 
       } 
      } 
      catch(NullPointerException e) 
      { 
       this.autoCommit = false; 
       jdbcConn.setAutoCommit(false); 
      } 
     } 
     if(this.isolationMode!= Constants.TRANSCATION_ISOLATION_DEFAULT) 
      jdbcConn.setTransactionIsolation(this.isolationMode); 
    } 
} 

我們正在尋找的其他課程是CallStatement.java課程。在這裏面我們將不得不找到getCallableParamMetaData()方法,我已經粘貼下面:

private java.util.List getCallableParamMetaData() 
{ 
    java.util.List paramMetaDataList = new ArrayList(); 
    try 
    { 
     DatabaseMetaData metaData = conn.getMetaData(); 
     String cataLog = conn.getCatalog(); 
     String procedureNamePattern = getNamePattern(this.paramUtil.getProcedure()); 
     String schemaPattern = null; 
     if (this.paramUtil.getSchema() != null) 
     { 
      schemaPattern = getNamePattern(this.paramUtil.getSchema()); 
     } 

     // handles schema.package.storedprocedure for databases such as 
     // Oracle 
     if (!metaData.supportsCatalogsInProcedureCalls()) 
     { 
      if (this.paramUtil.getPackage() != null) 
      { 
       cataLog = getNamePattern(this.paramUtil.getPackage()); 
      } 
     } 

     java.sql.ResultSet rs = null; 
     rs = metaData.getProcedureColumns(cataLog, 
       schemaPattern, 
       procedureNamePattern, 
       null); 
     while (rs.next()) 
     { 
      ParameterDefn p = new ParameterDefn(); 
      p.setParamName(rs.getString("COLUMN_NAME")); 
      p.setParamInOutType(rs.getInt("COLUMN_TYPE")); 
      p.setParamType(rs.getInt("DATA_TYPE")); 
      p.setParamTypeName(rs.getString("TYPE_NAME")); 
      p.setPrecision(rs.getInt("PRECISION")); 
      p.setScale(rs.getInt("SCALE")); 
      p.setIsNullable(rs.getInt("NULLABLE")); 
      if (p.getParamType() == Types.OTHER) 
       correctParamType(p); 
      paramMetaDataList.add(p); 
     } 
     rs.close(); 
    } 
    catch (SQLException e) 
    { 
     logger.log(Level.SEVERE, "Fail to get SP paramters", e); 
    } 
    catch(JDBCException ex) 
    { 
     logger.log(Level.SEVERE, "Fail to get SP paramters", ex); 
    } 

    return paramMetaDataList; 
} 

基本上某處while (rs.next())循環中位於罪魁禍首拋出NullPointerException異常。所以我們需要做的就是添加一個catch語句把它當作如下:

private java.util.List getCallableParamMetaData() 
{ 
    java.util.List paramMetaDataList = new ArrayList(); 
    try 
    { 
     DatabaseMetaData metaData = conn.getMetaData(); 
     String cataLog = conn.getCatalog(); 
     String procedureNamePattern = getNamePattern(this.paramUtil.getProcedure()); 
     String schemaPattern = null; 
     if (this.paramUtil.getSchema() != null) 
     { 
      schemaPattern = getNamePattern(this.paramUtil.getSchema()); 
     } 

     // handles schema.package.storedprocedure for databases such as 
     // Oracle 
     if (!metaData.supportsCatalogsInProcedureCalls()) 
     { 
      if (this.paramUtil.getPackage() != null) 
      { 
       cataLog = getNamePattern(this.paramUtil.getPackage()); 
      } 
     } 

     java.sql.ResultSet rs = null; 
     rs = metaData.getProcedureColumns(cataLog, 
       schemaPattern, 
       procedureNamePattern, 
       null); 
     while (rs.next()) 
     { 
      ParameterDefn p = new ParameterDefn(); 
      p.setParamName(rs.getString("COLUMN_NAME")); 
      p.setParamInOutType(rs.getInt("COLUMN_TYPE")); 
      p.setParamType(rs.getInt("DATA_TYPE")); 
      p.setParamTypeName(rs.getString("TYPE_NAME")); 
      p.setPrecision(rs.getInt("PRECISION")); 
      p.setScale(rs.getInt("SCALE")); 
      p.setIsNullable(rs.getInt("NULLABLE")); 
      if (p.getParamType() == Types.OTHER) 
       correctParamType(p); 
      paramMetaDataList.add(p); 
     } 
     rs.close(); 
    } 
    catch (SQLException e) 
    { 
     logger.log(Level.SEVERE, "Fail to get SP paramters", e); 
    } 
    catch(JDBCException ex) 
    { 
     logger.log(Level.SEVERE, "Fail to get SP paramters", ex); 
    } 
    catch(NullPointerException ex1) 
    { 
     logger.log(Level.SEVERE, "Fail to get SP paramters", ex1); 
    } 
    return paramMetaDataList; 
} 

一旦你完成了你修改的文件,你確實需要重新編譯源代碼。要做到這一點,你需要從Eclipse的插件文件夾中複製幾個jar文件到你放置你正在編譯的文件所在的文件夾中。下面的代碼給出了你需要輸入的命令來編譯你的源代碼。下面是你需要以進入編譯每個文件的內容:

JdbcMetaDataProvider.java

javac -cp ".; 
c:/mypath/org.eclipse.birt.report.data.bidi.utils_4.6.0.v201606072122.jar; 
c:/mypath/org.eclipse.birt.report.data.oda.jdbc.ui_4.6.0.v201606072122.jar; 
c:/mypath/oda-jdbc.jar; 
c:/mypath/org.eclipse.datatools.connectivity.oda_3.5.0.201603142002.jar; 
c:/mypath/org.eclipse.datatools.connectivity.oda.design_3.4.0.201603142002.jar; 
c:/mypath/org.eclipse.datatools.connectivity.oda.design.ui_3.3.0.201603142002.jar; 
c:/mypath/org.eclipse.emf.ecore_2.12.0.v20160420-0247.jar; 
c:/mypath/org.eclipse.emf.common_2.12.0.v20160420-0247.jar" JdbcMetaDataProvider.java > log.txt 2>&1 

連接。java的

javac -cp ".; 
c:/mypath/org.eclipse.birt.report.data.bidi.utils_4.6.0.v201606072122.jar; 
c:/mypath/oda-jdbc.jar; 
c:/mypath/org.eclipse.datatools.connectivity.oda_3.5.0.201603142002.jar; 
c:/mypath/com.ibm.icu_56.1.0.v201601250100.jar" Connection.java > log.txt 2>&1 

CallStatement.java現在

javac -cp ".; 
c:/mypath/oda-jdbc.jar; 
c:/mypath/org.eclipse.datatools.connectivity.oda_3.5.0.201603142002.jar; 
c:/mypath/com.ibm.icu_56.1.0.v201601250100.jar" CallStatement.java > log.txt 2>&1 

,有一對夫婦的需要說一下上面的兩個命令的東西:

1)他們實際上需要一個進入線。我只是爲了清晰起見而將它們分解,以便每個需要的罐子很容易被發現。

2)這實際上是一個Windows命令。如果您在Linux上運行該命令,則每個jar需要用冒號(:)而不是分號(;)分隔。

一旦編譯成功,你會用下面的.class文件結束:

JdbcMetaDataProvider$1TempThread.class 
JdbcMetaDataProvider$2TempThread.class 
JdbcMetaDataProvider.class 

Connection$Constants.class 
Connection.class 

CallStatement.class 

這些都需要複製回原來的jar文件,以便它們替換文件已經存在。幸運的是,一個jar文件只不過是一個zip文件,所以在windows中,任何解壓縮軟件都會輕鬆地爲您打開一些東西,並允許您導航到正確的文件夾。

下面是每個罐子有問題的文件夾:

org\eclipse\birt\report\data\oda\jdbc\ui\provider\ 
org\eclipse\birt\report\data\oda\jdbc\ 
org\eclipse\birt\report\data\oda\jdbc\ 

一旦這樣做了,重新啓動Eclipse和事情應該重新工作像正常。我希望這可以幫助未來的人。