我在Oracle中创建了一个带有tabletype参数的存储过程,如bellow
create or replace PROCEDURE CREATENEWPrj
(
Name IN VARCHAR2,
countryVal IN VARCHAR2,
outingDetailsInfo IN TBLSHIPPINGINFO
)
AS
......
.....
尝试从我的java代码中调用过程,如bellow
Gson gson=new Gson();
Type listType = new TypeToken<List<ShippingInfo>>(){}.getType();
List<ShippingInfo> shippingInfo= gson.fromJson(requestObj.getString("shipping"),listType);
try
{
call = app.databaseHelper.preparedCall("CREATENEWPrj(?,?,?)");
call.setString(1,requestObj.getString("Name"));
call.setString(2,requestObj.getString("countryVal"));
Driver myDriver = new oracle.jdbc.driver.OracleDriver();
DriverManager.registerDriver( myDriver );
Connection conn = DriverManager.getConnection(URL, USER, PASS);
STRUCT[] structs = new STRUCT[shippingInfo.size()];
StructDescriptor structDescriptor =
StructDescriptor.createDescriptor("SHIPPINGINFO",conn);
for (int i = 0; i < shippingInfo.size(); ++i) {
ShippingInfo str =
shippingInfo.get(i);
Object[] objects = new Object[] { str.getCarrierId(),str.getRouteId()};
STRUCT struct =new STRUCT(structDescriptor, conn, objects);
structs[i] = struct;
}
ArrayDescriptor arrayDescriptor =ArrayDescriptor.createDescriptor("TBLSHIPPINGINFO",conn);
ARRAY arraypass = new ARRAY(arrayDescriptor, conn, structs);
call.setArray(3, arraypass);
call.execute();
}
但是从`call.setArray(24,arraypass)获取异常"java.lang.ClassCastException: oracle.sql.ARRAY cannot be cast to oracle.sql.ARRAY"
;
oracle.sql.ARRAY.class.getProtectionDomain()。getCodeSource()。的getLocation() 和 arraypass.getClass()。getProtectionDomain()。getCodeSource()。的getLocation() 两者都是平等的
选中&#34; oracle.sql.ARRAY.class.getClassLoader()。equals(array_pass.getClass()。getClassLo ader());&#34; ,它也返回True
请指导我解决这个问题。
答案 0 :(得分:0)
您已多次加载驱动程序。我经常在tomcat中看到这个,他们分享这样的背景:
现在,如果您从Webapp1向Webapp2提供oracle.sql.ARRAY
的实例,则此 ClassCastException 会出现。
解决方案是只加载一次ojdbc: