java.lang.ClassCastException:oracle.sql.ARRAY无法强制转换为oracle.sql.ARRAY

时间:2015-12-14 09:05:47

标签: java arrays oracle

我在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

请指导我解决这个问题。

1 个答案:

答案 0 :(得分:0)

您已多次加载驱动程序。我经常在tomcat中看到这个,他们分享这样的背景:

  • Tomcat -URLClassLoader with out ojdbc.jar   
          
    • Webapp1 - 带有webapp1 / libs / ojdbc.jar的URLClassLoader
    •     
    • Webapp2 - 带有webapp2 / libs / ojdbc.jar的URLClassLoader
    •   

现在,如果您从Webapp1向Webapp2提供oracle.sql.ARRAY的实例,则此 ClassCastException 会出现。

解决方案是只加载一次ojdbc:

  • Tomcat -URLClassLoader,只有一个ojdbc.jar   
          
    • Webapp1 - URLClassLoader out ojdbc.jar
    •     
    • Webapp2 - URLClassLoader out ojdbc.jar
    •