2016-09-15 5 views
0

私たちはBIRTレポートでEsprocをしばらく使用しており、すべてが完璧に機能しました。私たちは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

わかりましたが、私は実際に働いて物事を得ることができたし、解決策は、私は些細な呼びたいかを正確にではありません。私は実際に3つの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がスローされます。例外を処理するための "キャッチ"ブロックがないと、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; 
} 

はさて、私たちは変更する必要があるコードの次の2ビットは oda-jdbc.jarパッケージに配置されています。私たちが最初に探しているのは、 Connection.javaクラス、より具体的にはメソッド populateConnectionProp()です。 NullPointerExceptionを投げ

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); 
    } 
} 

今回犯人はこのライン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); 
    } 
} 

もう1つのクラスは、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ファイルをコピーする必要があります。 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 

接続。

1)彼らは実際には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 

さて、上記の二つのコマンドについて語ったする必要が物事のカップルがありますライン。私は、分かりやすくするためにそれらを壊しただけで、必要な各瓶が見つけやすくなりました。

2)これは実際にはWindowsコマンドです。 Linuxでコマンドを実行している場合は、各jarをセミコロン(;)の代わりにコロン(:)で区切る必要があります。

コンパイルが成功したら、あなたは以下の.classファイルになってしまいますが:

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

Connection$Constants.class 
Connection.class 

CallStatement.class 

これらは、すでにそこにあるファイルを置き換えるように、元のjarファイルにコピーする必要があります。幸いなことに、jarファイルはzipファイル以外のものではありません。ウィンドウでは、解凍されたソフトウェアは簡単に開くことができ、適切なフォルダに移動することができます。それが終わったらだ

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

、Eclipseを再起動して、物事が再び通常のように動作するはずです:

は、ここで各ジャーのための問題のフォルダです。私はこれが将来誰かを助けることを願っています。