2011-03-08 104 views
4

我已经在META-INF/context.xml中定义的数据库数据源的Web应用程序:JNDI JDBC数据源7

<Context> 
    <Resource 
     name="jdbc/mkddb" 
     auth="Container" 
     type="javax.sql.DataSource" 
     maxActive="10" 
     maxIdle="5" 
     maxWait="10000" 
     driverClassName="org.postgresql.Driver" 
     username="woky" 
     password="XYZ" 
     url="jdbc:postgresql://[::1]:5433/mkddb" /> 
</Context> 

,这是我peristence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 
    <persistence-unit name="myJpaUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <non-jta-data-source>java:comp/env/jdbc/mkddb</non-jta-data-source> 
     <class>mkd.model.User</class> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

,这我怎么在我的测试代码运行Tomcat(7.0.8):

Tomcat tomcat = new Tomcat(); 
tomcat.addWebapp("", "ROOT"); 
tomcat.enableNaming(); 
tomcat.start(); 
System.in.read(); 
tomcat.stop(); 

有一个在我的工作空间,我们一个tomcat.8080目录bapps和工作目录。 ROOT指向src/main/webapp(所有的Java代码都在classpath中)。

问题是我得到以下情况例外,当我运行这段代码:

javax.persistence.PersistenceException: [PersistenceUnit: myJpaUnit] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:892) 
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48) 
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32) 
    at com.google.inject.persist.jpa.JpaPersistService.start(JpaPersistService.java:94) 
    at com.google.inject.persist.PersistFilter.init(PersistFilter.java:77) 
    at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:114) 
    at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98) 
    at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172) 
    at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273) 
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254) 
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372) 
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98) 
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4461) 
    at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5133) 
    at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5128) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    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) 
Caused by: org.hibernate.HibernateException: Could not find datasource 
    at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:79) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:137) 
    at org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:51) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:91) 
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:883) 
    ... 20 more 
Caused by: javax.naming.NameNotFoundException: Name jdbc is not bound in this Context 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:803) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:145) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:814) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:145) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:814) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:159) 
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:75) 
    ... 28 more 

我在做什么错?

谢谢。

+0

待办事项你有为你的数据库安装的JDBC驱动程序? – 2011-03-09 07:24:21

+0

是的,它在classpath中。如果我将war /目录复制到$ TOMCAT_HOME/webapps并运行'$ TOMCAT_HOME/bin/catalina.sh run',它就可以工作。 – woky 2011-03-09 12:31:43

回答

7

我认为即使配置文件位于默认位置(META-INF),嵌入式Tomcat实现也不会自动解析配置文件(context.xml)。如果以编程方式设置配置文件,则应用程序应该能够创建数据源。确保您的context.xml的路径正确。这里有一个例子:

File configFile = new File("META-INF/context.xml") 
Context context = tomcat.addWebapp("", "ROOT"); 
context.setConfigFile(configFile.toURI().toURL()); 
+0

我遇到了这个确切的问题;你的解决方案给了我以下错误:'org.apache.catalina.Context.setConfigFile(Ljava/lang/String;)V java.lang.NoSuchMethodError:org.apache.catalina.Context.setConfigFile(Ljava/lang/String; )V';有任何想法吗 ? – wulfgarpro 2011-06-14 03:50:29

+0

听起来像你想使用'java.lang.String'而不是'java.net.URL'来设置配置文件。有关更多信息,请参阅[JavaDocs](http://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/Context.html#setConfigFile%28java.net.URL%29)。 – 2011-06-14 12:14:38

+0

谢谢;我确定我的IDE在抱怨昨天使用了一个URL ..工作正常。 – wulfgarpro 2011-06-14 23:53:17

0

我有此配置同样的问题:

<Resource name="jdbc/casper" ... ... /> 

所致:javax.naming.NameNotFoundException:名称JDBC是不是在这方面的约束

我终于使其工作改变到这样的配置:

<Resource name="jdbc/Casper" ... ... /> 

是的,这是荒谬的,我不知道它是否是规范的一部分,但名称必须以大写形式的第一个字母。我看到你正在使用“jdbc/mkddb”,尝试使用“jdbc/Mkddb”,并且不要忘记更改对该名称的所有引用。

我希望这是你的解决方案,JNDI错误是相当繁琐

3

BTW,您可以用嘲笑JNDI上下文从弹簧测试框架,将面向嵌入式Tomcat的工作,以及,EQ:

OracleDataSource ods = new OracleDataSource(); 
ods.setURL("jdbc:oracle:thin:@127.0.0.1:1521/orcldb"); 
ods.setUser("*"); 
ods.setPassword("*"); 
SimpleNamingContextBuilder builder = null; 
    try { 
     builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder(); 
     builder.bind("java:comp/env/jdbc/db",ods); 
    } catch (NamingException e) { 
     logger.error(e); 
    } 
相关问题