WSCallHelper.jdbcCall WAS 8.5的XMLType映射实现

问题描述:

早上好!
我试图从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

为什么你需要使用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");