What is a TestClass? Tomcat has no knowledge about your class for injection
occurs.
Please define some servlet and try with it,
class TestClass extends HttpServlet{
private @Resource(name="jdbc/TestDb") DataSource datasource;
@PostConstruct
public void postConstruct(){
//Check datasource here
}
}
--Gurkan
________________________________
From: marble4u <[email protected]>
To: [email protected]
Sent: Wed, June 16, 2010 11:27:24 AM
Subject: Resource Annotation has no effect but JNDI Lookup works (JDBC Resource)
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.