You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by "Claus Giesenberg (1&1 Privat)" <cg...@online.de> on 2006/02/15 16:47:37 UTC

Tomcat & JNDI -> javax.naming.NamingException: Cannot create resource instance

Hi !

While writing a custom JNDI Resource factory, Tomcat 5 runs into an 
exception i can't explain:

  javax.naming.NamingException: Cannot create resource instance
    at 
org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:132)
    at 
javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:301)

this exception will be thrown by the following code lines:

    private void initDBConnectionPool(){
           try {               
                Context ctx = new InitialContext();   
                Context envCtx = (Context) ctx.lookup("java:comp/env");
                thePool = (DBConnectionPool)
    envCtx.lookup("webarts/DBConnectionPool");                   
            }  catch (NamingException e) {
                e.printStackTrace();           
            }
        }



To configure my resource factory i've added the following lines into to 
_server.xml_:

                 <Resource name="webarts/DBConnectionPool" 
auth="Container" type="de.webarts.DBConnectionPool.DBConnectionPool"/>
                 <ResourceParams name="webarts/DBConnectionPool">
                     
<parameter><name>factory</name><value>de.webarts.DBConnectionPool.DBConnectionPoolSingleton</value></parameter>    
                                         
                    
<parameter><name>driverClassName</name><value>oracle.jdbc.driver.OracleDriver</value></parameter>
                    
<parameter><name>driverName</name><value>jdbc:oracle:thin:@################</value></parameter>     

                    
<parameter><name>user</name><value>######</value></parameter>
                    
<parameter><name>password</name><value>######</value></parameter>
                    
<parameter><name>poolSize</name><value>10</value></parameter>
                    
<parameter><name>maxSize</name><value>30</value></parameter>   
                    
<parameter><name>initSize</name><value>5</value></parameter>
                    
<parameter><name>expiryTime</name><value>18000</value></parameter>    
       
                    
<parameter><name>poolName</name><value>WebArts_DBConnectionPool</value></parameter>    
        
                </ResourceParams>       


For declaring the custom resource factory i have added the following 
lines into the _web.xml_

    <resource-ref>
        <description>DBConnectionPool Factory</description>
        <res-ref-name>webarts/DBConnectionPool</res-ref-name>
        <res-type>de.webarts.DBConnectionPool.DBConnectionPool</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

My factory class looks like that:


package de.webarts.DBConnectionPool;
import javax.naming.*;
import java.util.Enumeration;
import java.util.Hashtable;
import de.webarts.DBConnectionPool.*;


public final class  DBConnectionPoolSingleton implements ObjectFactory {
   
    private static DBConnectionPool theStaticPool = null;
       
    private DBConnectionPoolSingleton(){   
    }
   
    public static DBConnectionPool createDBConnectionPool(String name, 
int poolSize, int maxSize, int initSize, int expiryTime, String url, 
String passwd, String user){
        if (theStaticPool != null) {
            theStaticPool =  new DBConnectionPool(name, poolSize, 
maxSize, initSize, expiryTime, url, passwd, user);
        }
        return theStaticPool;
    }

 
    public Object getObjectInstance(Object obj, Name name, Context 
nameCtx, Hashtable environment) throws Exception {

        Reference ref = (Reference) obj;
        Enumeration enumRef = ref.getAll();
       
        String poolName            = "WebArts DBConnectionPool";        
// "poolName"
        String driverClassName  = null;                               // 
"driverClass"
        String driverName          = null;                            
    // "driverName"
        String user                     = null;                        
        // "user"   
        String password             = null;                           
    // "password"
       
        int poolSize     = 0;           // "poolSize"
        int maxSize      = 0;           // "maxSize"
        int initSize     = 0;          // "intSize"
        int expiryTime     = 18000;     // "expiryTime"
       
       
        // extract the values for the parameters specified in server.xml
        // and create a database connection pool as singleton.
        while (enumRef.hasMoreElements()) {
            RefAddr refAddr = (RefAddr) enumRef.nextElement();
            String type      = refAddr.getType();           
            String value     = (String)refAddr.getContent();
           
            if (type.equals("poolName")) {
                poolName = value;
            } else
                if (type.equals("driverClassName")) {
                    driverClassName = value;
                } else
                    if (type.equals("driverName")) {
                        driverName = value;
                    } else
                        if (type.equals("user")) {
                            user = value;               
                        } else
                            if (type.equals("password")) {
                                password = value;
                            } else
                                if (type.equals("poolSize")) {
                                    poolSize = 
Integer.getInteger(value).intValue();
                                } else
                                    if (type.equals("maxSize")) {
                                        maxSize = 
Integer.getInteger(value).intValue();
                                    } else
                                        if (type.equals("initSize")) {
                                            initSize = 
Integer.getInteger(value).intValue();
                                        } else
                                            if (type.equals("expiryTime")) {
                                                expiryTime = 
Integer.getInteger(value).intValue();
                                            }           
        } // end while
        return createDBConnectionPool(poolName, poolSize, maxSize, 
initSize, expiryTime, driverName, password, user);
    }
   

Anybody has a clue of what I might be doing wrong?
Every hint or idea is very welcome.

Best regards,
Claus