获得空指针异常@Resource注释在tomact 7 [英] Getting null pointer exception @Resource annotation in tomact 7
问题描述
下面是我的context.xml Resource元素:
Here is my Resource element in context.xml ::
<Resource name="jdbc/myoracle" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:XE"
username="hr" password="hr" maxActive="20" maxIdle="10"
maxWait="-1"/>
下面是在web.xml中我的资源引用:
Here is my Resource reference in web.xml:
<resource-ref>
<description>Oracle Datasource</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
然后我用 @Resource
标注在我的code:
@Resource(mappedName = "jdbc/myoracle")
DataSource ds;
当我尝试使用的getConnection()在DS创建连接对象,我在运行时得到一个空指针异常:
When I try to create connection object using getConnection() on ds, I get a null pointer exception during runtime:
Oct 24, 2011 12:18:21 PM org.apache.catalina.core.StandardWrapperValve invoke
INFO: java.lang.NullPointerException
at jdbc.patientDaoImpl.get_patients(patientDaoImpl.java:248)
at org.apache.jsp.index2_jsp._jspService(index2_jsp.java:92)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:223)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:399)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:317)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:204)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:311)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
但是,如果我用查找InitialContext的应用程序工作正常。
But if I lookup using initialContext the app works fine.
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
我在哪里去了?
推荐答案
Tomcat本身并不支持 @Resource
注入。换句话说,servlet容器不能识别的注释,不能用它做任何事情。手工查找的工作,因为资源是正确定义。
Tomcat itself does not support @Resource
injection. In other words, the servlet container does not recognize that annotation and can't do anything with it. Manual lookup works, because the resource is defined properly.
您需要一些依赖注入框架:
You need some dependency-injection framework:
- 春季
- CDI(在JavaEE6网络配置文件的一部分)
- EJB(在JavaEE6网络配置文件,不完全是DI框架的一部分)
这篇关于获得空指针异常@Resource注释在tomact 7的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!