java.lang.ClassCastException: oracle.sql.CLOB usando JNDI

    postado por: Gregui Shigunov | Tags , |

    Para melhorar a performance do projeto dentro do tomcat, resolvi utilizar o pool de conexões. E me deparei com o seguinte erro:

    java.lang.ClassCastException: oracle.sql.CLOB usando JNDI


    Antes:

    Class.forName("oracle.jdbc.driver.OracleDriver");
    this.conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:DB_EXEMPLO", "usuario", "senha");


    depois:

    Context initContext = new InitialContext();
    Context envContext = (Context) initContext.lookup("java:/comp/env");
    DataSource ds = (DataSource)envContext.lookup("jdbc/exemplo");
    this.conn = ds.getConnection();


    Alterei também o arquivo de contexto da aplicação tomcat:
    "apache-tomcat-5.5\conf\Catalina\localhost\exemplo.xml"


    <Context path="/exemplo" reloadable="true" docBase="F:\XXX\exemplo" workDir="G:\XXX\exemplo\work">
    <Resource name="jdbc/exemplo" auth="Container" type="javax.sql.DataSource"
    username="xxxx"
    password="yyyy"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@127.0.0.1:1521:DB_EXEMPLO"
    maxWait="-1"
    removeAbandoned="true"
    maxActive="10000"
    maxIdle="20"
    removeAbandonedTimeout="180"
    logAbandoned="true"
    accessToUnderlyingConnectionAllowed="true"
    />
    </Context>



    Quando fui utilizar um campo do tipo Clob! Levantou a seguinte exceção:

    java.lang.ClassCastException: oracle.sql.CLOB
    at midiaweb.Dao.populaVO(Dao.java:759)
    at midiaweb.Dao.getLista(Dao.java:625)
    at midiaweb.servlet.ServletLogin.execute(ServletLogin.java:39)
    at midiaweb.ServletPai.doGet(ServletPai.java:35)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAsPrivileged(Unknown Source)
    at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276)
    at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:162)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:262)
    at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:52)
    at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:171)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:167)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
    at java.lang.Thread.run(Unknown Source)


    E aqui o fonte de onde ocorreu o erro:


    oracle.sql.CLOB objTeste = rs.getClob("CAMPO_CLOB");
    if (objTeste!= null) {
    System.out.println(objTeste.getClass().getName()); //"oracle.sql.CLOB"
    oracle.sql.CLOB clob = (oracle.sql.CLOB) objTeste; //ERRO AQUI
    String valor = this.getClob(clob);


    Com o teste, notei que o objTeste era um "oracle.sql.CLOB" e o objeto clob também era um "oracle.sql.CLOB".

    Então pensei, como isso é possível?

    Logo pensei!!!

    1. Para levantar um erro de Cast, e as classes têm o mesmo nome, então deve haver 2 versões do pacote.

    2. E, como o JNDI é uma biblioteca e faz parte do tomcat, logo a classe que ele me retorna, não é uma classe do lib do meu projeto

    Removi a biblioteca que estava no lib do meu WEB_INF, no caso era "classes12.jar", e bimba! (é claro que no eclipse, para poder compilar, coloquei a referência para o pacote, senão não compila)

    Ou seja, havia 2 pacotes exatamente iguais. Usando JNDI havia uma refência e em minha aplicação outra!

    Comments (0)

    Postar um comentário

     
    BlogBlogs.Com.Br