Hello everybody,

I have been struggeling a long time with this problem, but didn't solve it.
I have a tomcat server 6.0.24 and try to use the resource annotation to get
ms sql database access. It works fine if i do a jndi lookup without
annotations, but if I try to use resource injection my DataSource dataSource
is always null so that I get a NullPointerException when trying to retrieve
a connection through 
dataSource.getConnection()


*Here is my test set up:*


web.xml


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
xmlns="http://java.sun.com/xml/ns/javaee";
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd";
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"; id="WebApp_ID"
version="2.5">

  <display-name>ResourceTest</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>
    <resource-ref>
         <description>testDb</description>
         <res-ref-name>jdbc/testDb</res-ref-name>
         <res-type>javax.sql.DataSource</res-type>

         <res-auth>Container</res-auth>
</resource-ref>
</web-app>


context.xml:


<Context path="/ResourceTest">

<Resource name="jdbc/testDb" auth="Container" type="javax.sql.DataSource"
                maxActive="100" maxIdle="30" maxWait="10000" username="someuser"
password="somepassword"

                driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                
url="jdbc:sqlserver://thinkmarble\vps:1433;databaseName=someName" />
</Context>


Here's the code which throws a NullPointerException  in the try clause since
db is null:



package test;
 
import java.sql.Connection;
import javax.annotation.Resource;
import javax.sql.DataSource;
 
public class TestClass {

 
        @Resource(name = "jdbc/testDb") private DataSource db;
 
        public void testMethod() {

                try {
                        Connection conn = db.getConnection();
                } catch (Exception e) {
                        e.printStackTrace();
                }

        }
}



Of course I added the jdbc lib to the tomcat lib and tried many things and
as I said: it all works fine with...


...the following jndi lookup code:


package test;

 
import java.sql.Connection;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
 
public class JndiTest {

 
        public void testMethod() {
                Context initCtx;
                try {
                        initCtx = new InitialContext();
                        Context envContext = (Context) 
initCtx.lookup("java:/comp/env");
                        DataSource db = (DataSource) 
envContext.lookup("jdbc/testDb");
                        Connection conn = db.getConnection();
                } catch (Exception ex) {

                        ex.printStackTrace();
                }
        }
}


Here is the Exception I get:


java.lang.NullPointerException
        at test.TestClass.testMethod(TestClass.java:18)
        at org.apache.jsp.index_jsp._jspService(index_jsp.java:60)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
        at 
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
        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:127)
        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:298)
        at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
        at
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
        at 
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
        at java.lang.Thread.run(Unknown Source)



I can remember that it once worked like a charme, but some how it doesn't
anymore - I even downloaded and installed tomcat again and set up a new
workspace in eclipse. Why does it work with JNDI but not with Resource
annotations? I am thankful for any help.


PS: I shortend the code down to the essential lines - please don't argue
about the Exception handling...
-- 
View this message in context: 
http://old.nabble.com/Resource-Annotation-has-no-effect-but-JNDI-Lookup-works-%28JDBC-Resource%29-tp28900220p28900220.html
Sent from the Tomcat - User mailing list archive at Nabble.com.

Reply via email to