2016-02-26 42 views
1

早上好!
我試圖從Websphere 6.5升級到8.5。當應用程序提交XML數據DB我得到以下錯誤:WSCallHelper.jdbcCall WAS 8.5的XMLType映射實現

Caused by: 
java.sql.SQLException: java.lang.IllegalAccessException: Class com.ibm.ws.rsadapter.jdbc.WSJdbcUtil can not access a member of class oracle.jdbc.driver.OraclePreparedStatementWrapper with modifiers "public" 
    at com.ibm.ws.rsadapter.AdapterUtil.toSQLException(AdapterUtil.java:1727) 
    at com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.call(WSJdbcUtil.java:684) 
    at com.ibm.ws.rsadapter.jdbc.WSJdbcUtil.call(WSJdbcUtil.java:377) 
    at com.ibm.websphere.rsadapter.WSCallHelper.jdbcCall(WSCallHelper.java:302) 
    at J.D.A.A.WASOracleXMLType.nullSafeSet(Unknown Source) 
    at J.D.A.A.A.nullSafeSet(Unknown Source) 
    at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:146) 

經過一段時間調查,我認爲,我已經找到了給我的問題:一個WebSphere方法名jdbcCall有5個參數在WebSphere 6.5中,但現在可以有6個參數。這裏描述

的方法:https://www-01.ibm.com/support/knowledgecenter/SS7K4U_8.5.5/com.ibm.websphere.javadoc.doc/web/apidocs/com/ibm/websphere/rsadapter/WSCallHelper.html 和參數是這樣的:

**vendorClassName** - The name of the vendor-specific interface class 
on which methName is defined. This value can be used in cases where the 
implementation class of the vendor's JDBC object is a protected class, i.e. 
calling methName on the underlying JDBC object produces an **IllegalAccessException**. This value should specify the name of the vendor's recommended Class/Interface which is extended/implemented by the underlying JDBC object. For example "oracle.jdbc.driver.OracleResultSet" may need to be specified when the underlying object is an OracleResultSetImpl object. If not needed, this value may be null. 

這是我實現:

com.ibm.websphere.rsadapter.WSCallHelper.jdbcCall(
        null, 
        a-Prepared-Statement, //OraclePreparedStatementWrapper 
        "setObject", 
        new Object[]{new Integer(index), xmlType}, 
        new Class[]{int.class, Object.class}) 

所以,我讀過的文件,但我不明白我應該插入vendorClassName,可能是足夠的「oracle.jdbc.OracleDriver」?任何人都可以更好地解釋我可以理解我應該在這個參數中插入什麼?
否則你認爲可能是什麼問題?
我使用Oracle12c,ojdbc6和WebSphere 8.5
謝謝!

+0

什麼是'aStatement'的類類型?我假設它是某種語句,但是任何ojdbc6語句類都沒有'setObj(int,Object)'方法。方法名稱參數必須與類中的方法名稱相對應。你的意思是傳遞''setObject「'而不是? –

+0

假設我只是缺少'setObj(int,Object)'方法來自哪個類,傳入'setObj(int,Object)'所在的類的vendorClassName應該修復你的問題 –

+0

對不起,我的錯誤,第三個參數是「setObject」,java.sql.PreparedStatement可能(我沒有可能直接在WebSphere上調試這個代碼)是一個OraclePreparedStatementWrapper – Delayer

回答

1

爲什麼你需要使用WSCallHelper.jdbcCall()
由於PreparedStatement.setObject(int, Object)完全是JDBC標準,因此您只需在語句對象上調用它即可,而無需執行任何類型的解包。如果您需要調用供應商特定的API,則只應嘗試解開WebSphere JDBC連接。

簡單地做:

aStatement.setObject(index, xmlType); 


如果您需要訪問供應商特定的API:
WSCallHelper.jdbcCall()用法是相當過時。我會建議使用Connection.unwrap(Class<?>)

例子:


如果你真的,真的需要使用WSCallHelper.jdbcCall()
在供應商類別名稱傳遞將允許的WebSphere加載的供應商類別,並在執行調用操作一個適當的類加載器的特權方式。

要傳入的供應商類名稱是您嘗試調用的供應商對象的類名稱。因此,如果您在Oracle驅動器上使用Statement,那麼您將傳遞字符串「oracle.jdbc.OracleStatement」作爲vendorClassName。

例子:

com.ibm.websphere.rsadapter.WSCallHelper.jdbcCall(
    null, 
    aStatement, // WSJdbcPreparedStatement wrapping an OraclePreparedStatement 
    "someOracleSpecificMethod", 
    new Object[]{new Integer(index), xmlType}, 
    new Class[]{int.class, Object.class}, 
    "oracle.jdbc.OracleStatement");