I'm using Java 1.6, tomcat 6.0.16/6.0.20 and axis2 1.4.1. I can't get my 
servlets to talk to Oracle. All I get is "[ERROR] Cannot create JDBC driver of 
class '' for connect URL 'null'"

I have tried to get answers on the tomcat users list and the Axis2 users list, 
but after 2 weeks, I'm very little further forward and I think I'm going to 
have to dig into the source code to find out where the problem lies. I would 
appreciate some pointers to which bits of the source code are most relevant.

I have created a mimimal servlet purely to investigate this problem.

The code is


package com.example.dbservlet;

import java.lang.Exception;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;


public class DBServlet
{
    private static final String DB_NAME = "jdbc/TestDatabase";
    private static final String CONTEXT_NAME = "java:/comp/env";

    public DBServlet()
    {}

    private Connection getConnection ()
        throws Exception, SQLException
    {
        Context initContext = new InitialContext();
        Context envContext = (Context) initContext.lookup(CONTEXT_NAME);
        DataSource ds = (DataSource)envContext.lookup(DB_NAME);
        return ds.getConnection();
    }

    public String getTime() throws Exception, SQLException
    {
        String time = "";

        Connection conn = getConnection();
        PreparedStatement stat = conn.prepareStatement(
            "SELECT TO_CHAR( SYSDATE, 'YYYY-MM-DD HH24:MI FROM DUAL" );

        ResultSet rSet = stat.executeQuery();

        if( rSet.next() )
        {
            time = rSet.getString(1);
        }

        stat.close();
        rSet.close();

        return time;
    }
}


In servlet-example/webapps/axis2/META-INF/context.xml I have

<Context>
    <Resource name="jdbc/TestDatabase" auth="Container"
              type="javax.sql.DataSource" 
driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@frogfoot:1521:w2"
              username="********" password="********"
              maxActive="20" maxIdle="10"
              maxWait="-1"/>
</Context>

In servlet-example/webapps/axis2/WEB-INF/web.xml I have

 ...
    <resource-ref>
        <description>Oracle Test Datasource</description>
        <res-ref-name>jdbc/TestDatabase</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>
 ...

When I try to call getTime() the full traceback is

[ERROR] Cannot create JDBC driver of class '' for connect URL 'null'
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at 
org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:165)
        at 
org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102)
        at 
org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
        at 
org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
        at 
org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
        at 
org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:133)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
        at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
        at java.lang.Thread.run(Thread.java:619)
Caused by: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot create JDBC 
driver of class '' for connect URL 'null'
        at 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1150)
        at 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
        at com.example.dbservlet.DBServlet.getConnection(DBServlet.java:44)
        at com.example.dbservlet.DBServlet.getTime(DBServlet.java:51)
        ... 25 more
Caused by: java.lang.NullPointerException
        at sun.jdbc.odbc.JdbcOdbcDriver.getProtocol(JdbcOdbcDriver.java:507)
        at sun.jdbc.odbc.JdbcOdbcDriver.knownURL(JdbcOdbcDriver.java:476)
        at sun.jdbc.odbc.JdbcOdbcDriver.acceptsURL(JdbcOdbcDriver.java:307)
        at java.sql.DriverManager.getDriver(DriverManager.java:253)
        at 
org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1143)
        ... 28 more
[ERROR] Cannot create JDBC driver of class '' for connect URL 'null'
org.apache.axis2.AxisFault: Cannot create JDBC driver of class '' for connect 
URL 'null'
        at 
org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:158)
        at 
org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
        at 
org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:100)
        at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:176)
        at 
org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
        at 
org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:133)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at 
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at 
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at 
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
        at 
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
        at 
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at 
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
        at 
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at 
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
        at 
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
        at 
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
        at 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

I have used strace to see whether it is accessing the context.xml file and it 
seems to be checking for it's existence, but not trying t open it, as I see a 
stat() call, but no open()

/tmp/catalina.trace.3726:stat64("/home/neil/wirefast/dev/tomcat6/servlet-example/webapps/axis2/META-INF/context.xml",
 {st_mode=S_IFREG|0644, st_size=343, ...}) = 0

Neil Youngman

Reply via email to