JSP: Problem beim öffnen einer JDBC-Connection
fredy
- java
Hi!
Ich möchte in einer JSP eine JDBC-Connection öffnen.
Die dafür nötigen Packages (javax.sql, JDBC-Treiber) sind in den
Verzeichnis /common/classes bzw. /common/lib
Beim Öffnen der Connection erhalte ich den folgenden Fehler:
javax.servlet.ServletException: Cannot create resource instance
Was mache ich falsch? Wie könnte ich den Fehler eingrenzen?
Danke und liebe Grüße
Manfred Steyer
ps.:
Der genaue Stack-Trace:
javax.servlet.ServletException: Cannot create resource instance
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:463)
at org.apache.jsp.test$jsp._jspService(test$jsp.java:78)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
at javax.servlet.http.HttpServlet.service(HttpServlet.java)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2343)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1012)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1107)
at java.lang.Thread.run(Thread.java:484)
root cause
javax.naming.NamingException: Cannot create resource instance
at org.apache.naming.factory.ResourceFactory.getObjectInstance(ResourceFactory.java:167)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:304)
at org.apache.naming.NamingContext.lookup(NamingContext.java:834)
at org.apache.naming.NamingContext.lookup(NamingContext.java:181)
at org.apache.naming.NamingContext.lookup(NamingContext.java:822)
at org.apache.naming.NamingContext.lookup(NamingContext.java:194)
at org.apache.jsp.test$jsp._jspService(test$jsp.java:67)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java)
at org.apache.jasper.servlet.JspServlet$JspServletWrapper.service(JspServlet.java:202)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:474)
at javax.servlet.http.HttpServlet.service(HttpServlet.java)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:243)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:190)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2343)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:170)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:468)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:564)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174)
at org.apache.catalina.core.StandardPipeline.invokeNext(StandardPipeline.java:566)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:472)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:943)
at org.apache.catalina.connector.http.HttpProcessor.process(HttpProcessor.java:1012)
at org.apache.catalina.connector.http.HttpProcessor.run(HttpProcessor.java:1107)
at java.lang.Thread.run(Thread.java:484)
Hallo Manfred,
Ich möchte in einer JSP eine JDBC-Connection öffnen.
Die dafür nötigen Packages (javax.sql, JDBC-Treiber) sind in den
Verzeichnis /common/classes bzw. /common/lib
Du benutzt also offensichtlich Tomcat als Servlet/JSP-Container.
Dann musst du aber Tomcat auch entsprechend konfigurieren, also
1. im Deployment Descriptor für Deine Web-Applikation eine Resource-Referenz angeben
2. In der server.xml die Resource anmelden
3. In der Tomcat-Konfiguration den Namen der JDBC-Ressource dem Kontext der Webapplikation mitgeben (die geworfene Naming-Exception deutet in diese Richtung!)
Steht hier z.B. ganz gut beschrieben (http://java.sun.com/webservices/docs/1.0/tutorial/doc/WebApp13.html#69868), v.a. wenn du mit Tomcat 4.1x arbeitest. Läßt sich aber auch für die 4.0.x Versionen rauslesen was zu tun ist
Beim Öffnen der Connection erhalte ich den folgenden Fehler:
javax.servlet.ServletException: Cannot create resource instance
Was mache ich falsch? Wie könnte ich den Fehler eingrenzen?
Zunächst mal die Konfiguration überprüfen.
Evtl. Rechteprobleme?
Gruß
Franz
Hallo!
Danke - Aber ich glaube, dass ich das gemacht habe:
:: web.xml
<Context path="" docBase="ROOT" debug="1" reloadable="true">
<Resource name="jdbc/autodb" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/autodb">
<parameter>
<name>user</name>
<value>...</value>
</parameter>
<parameter>
<name>password</name>
<value>...</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<parameter>
<name>driverName</name>
<value>autodb=jdbc:mysql://172.22.51.208/db</value>
</parameter>
</ResourceParams>
</Context>
:: server.xml
<web-app>
<resource-ref>
<description>
</description>
<res-ref-name>
jdbc/autoDB
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
</web-app>
Muss ich sonst noch ein File bearbeiten ?
Danke und lG
fredy
Hallo,
:: web.xml
<Context path="" docBase="ROOT" debug="1" reloadable="true">
<Resource name="jdbc/autodb" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/autodb">
<parameter>
<name>user</name>
<value>...</value>
</parameter>
<parameter>
<name>password</name>
<value>...</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<parameter>
<name>driverName</name>
<value>autodb=jdbc:mysql://172.22.51.208/db</value>
</parameter>
</ResourceParams>
</Context>
Also das obere steht bei mir nicht in der web.xml, sondern in der server.xml und das untere in der web.xml. Da wirst Du dich vermutlich aber nur veschusselt haben. Allerdings stimmen die Namen der Ressource nicht überein. Oben hat das name-Attribut des <Resource>-Elements den Wert "jdbc/autodb", während der Inhalt des Elements <res-ref-name> "jdbc/autoDB" lautet (db versus DB!). Kontextsensitivität vorausgesetzt, matchen die Namen nicht und es wird eine Naming-Exception geworfen.
:: server.xml
<web-app>
<resource-ref>
<description>
</description>
<res-ref-name>
jdbc/autoDB
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
</web-app>
Gruß
Franz
Hi!
Jetzt hab ichs angepasst, sodass es überall autoDB heisst.
Aber es funzt noch immer nicht.
Muss man sonst noch irgendwo was einstellen ?
Danke und lG
fredy
Hallo,
:: web.xml
<Context path="" docBase="ROOT" debug="1" reloadable="true">
<Resource name="jdbc/autodb" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/autodb">
<parameter>
<name>user</name>
<value>...</value>
</parameter>
<parameter>
<name>password</name>
<value>...</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>org.gjt.mm.mysql.Driver</value>
</parameter>
<parameter>
<name>driverName</name>
<value>autodb=jdbc:mysql://172.22.51.208/db</value>
</parameter>
</ResourceParams>
</Context>
Also das obere steht bei mir nicht in der web.xml, sondern in der server.xml und das untere in der web.xml. Da wirst Du dich vermutlich aber nur veschusselt haben. Allerdings stimmen die Namen der Ressource nicht überein. Oben hat das name-Attribut des <Resource>-Elements den Wert "jdbc/autodb", während der Inhalt des Elements <res-ref-name> "jdbc/autoDB" lautet (db versus DB!). Kontextsensitivität vorausgesetzt, matchen die Namen nicht und es wird eine Naming-Exception geworfen.
:: server.xml
<web-app>
<resource-ref>
<description>
</description>
<res-ref-name>
jdbc/autoDB
</res-ref-name>
<res-type>
javax.sql.DataSource
</res-type>
<res-auth>
Container
</res-auth>
</resource-ref>
</web-app>
Gruß
Franz