2010-09-20 78 views
8

我嘗試使用JNDI與Tomcat 5.5上的eclipseLink/JPA結合在java中設置數據庫連接。我已經在web.xml和context.xml中配置了JNDI資源。jndi與jpa和eclipselink的數據庫連接

db連接與JNDI一起使用,不使用JPA和eclipseLink。 爲eclipseLink配置persistence.xml之後,我得到以下異常。

我不知道如何正確配置persistence.xml以使用JNDI數據源進行數據庫連接。

例外

WicketMessage: Method onFormSubmitted of interface  
org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component  
[MarkupContainer [Component id = loginForm]] threw an exception 


Root cause: 

javax.naming.NamingException: This context must be accessed throught a java: URL 
at org.apache.naming.SelectorContext.parseName(SelectorContext.java:686) 
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:121) 
at javax.naming.InitialContext.lookup(InitialContext.java:396) 
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:110) 
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94) 
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:16 2) 
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(Datab aseSessionImpl.java:579) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228) 
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:380) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:157) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:214) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:202) 
at de.company.myDs.controller.AbstractCrudController.getEntityManager(Unknown Source) 
at de.company.myDs.controller.UserController.loadUserByName(Unknown Source) 
at de.company.myDs.controller.LoginController.validateUserLogin(Unknown Source) 
at de.company.myDs.pages.LoginPage$1.onSubmit(Unknown Source) 
at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1534) 
at org.apache.wicket.markup.html.form.Form.process(Form.java:934) 
at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:896) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182) 
at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 
at org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:312) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:873) 
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) 
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) 
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) 
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689) 
at java.lang.Thread.run(Thread.java:637) 

Complete stack: 

org.apache.wicket.WicketRuntimeException: Method onFormSubmitted of interface org.apache.wicket.markup.html.form.IFormSubmitListener targeted at component [MarkupContainer [Component id = loginForm]] threw an exception 
at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:193) 
at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 

java.lang.reflect.InvocationTargetException 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182) 
at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 

javax.persistence.PersistenceException: Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: Cannot acquire data source [java:comp/env/jdbc/myDs]. 
Internal Exception: javax.naming.NamingException: This context must be accessed throught a java: URL 
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:408) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:157) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:214) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:202) 
at de.company.myDs.controller.AbstractCrudController.getEntityManager(Unknown Source) 
at de.company.myDs.controller.UserController.loadUserByName(Unknown Source) 
at de.company.myDs.controller.LoginController.validateUserLogin(Unknown Source) 
at de.company.myDs.pages.LoginPage$1.onSubmit(Unknown Source) 
at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1534) 
at org.apache.wicket.markup.html.form.Form.process(Form.java:934) 
at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:896) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182) 
at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 

Exception [EclipseLink-7060] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: Cannot acquire data source [java:comp/env/jdbc/myDs]. 
Internal Exception: javax.naming.NamingException: This context must be accessed throught a java: URL 
at org.eclipse.persistence.exceptions.ValidationException.cannotAcquireDataSource(ValidationException.java:464) 
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:116) 
at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94) 
at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:162) 
at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:579) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:228) 
at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:380) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.getServerSession(EntityManagerFactoryImpl.java:157) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:214) 
at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:202) 
at de.company.myDs.controller.AbstractCrudController.getEntityManager(Unknown Source) 
at de.company.myDs.controller.UserController.loadUserByName(Unknown Source) 
at de.company.myDs.controller.LoginController.validateUserLogin(Unknown Source) 
at de.company.myDs.pages.LoginPage$1.onSubmit(Unknown Source) 
at org.apache.wicket.markup.html.form.Form.delegateSubmit(Form.java:1534) 
at org.apache.wicket.markup.html.form.Form.process(Form.java:934) 
at org.apache.wicket.markup.html.form.Form.onFormSubmitted(Form.java:896) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.apache.wicket.RequestListenerInterface.invoke(RequestListenerInterface.java:182) 
at org.apache.wicket.request.target.component.listener.ListenerInterfaceRequestTarget.processEvents(ListenerInterfaceRequestTarget.java:73) 
at org.apache.wicket.request.AbstractRequestCycleProcessor.processEvents(AbstractRequestCycleProcessor.java:92) 
at org.apache.wicket.RequestCycle.processEventsAndRespond(RequestCycle.java:1250) 
at org.apache.wicket.RequestCycle.step(RequestCycle.java:1329) 
at org.apache.wicket.RequestCycle.steps(RequestCycle.java:1428) 
at org.apache.wicket.RequestCycle.request(RequestCycle.java:545) 
at org.apache.wicket.protocol.http.WicketFilter.doGet(WicketFilter.java:479) 

的web.xml

... 
<resource-ref> 
    <description>DB Connection</description> 
    <res-ref-name>jdbc/myDs</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
</resource-ref> 
...  

的context.xml

... 
<Resource 
    name="jdbc/myDs" 
    auth="Container" 
    type="javax.sql.DataSource" 
    maxActive="100" 
    maxIdle="30" 
    validationQuery="SELECT 1" 
    testOnBorrow="true" 
    testWhileIdle="true" 
    timeBetweenEvictionRunsMillis="60000" 
    minEvictableIdleTimeMillis="600000" 
    username="root" 
    password="passwd" 
    maxWait="10000" 
    driverClassName="org.postgresql.Driver" 
    url="jdbc:postgresql://localhost:5432/myDs" /> 
... 

的persistence.xml

...  
<persistence-unit name="myDs" transaction-type="RESOURCE_LOCAL"> 

    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 

    <non-jta-data-source>java:comp/env/jdbc/myDs</non-jta-data-source> 

    <exclude-unlisted-classes>false</exclude-unlisted-classes> 

    <class>de.company.myDS.model.User</class> 

</persistence-unit> 
... 

回答

9

只需將類JPAEclipseLinkSessionCustomizer添加到您的項目並配置persistence.xml,如下所示:

<persistence-unit name="yourUnit" transaction-type="RESOURCE_LOCAL"> 

    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 

    <non-jta-data-source>java:comp/env/jdbc/yourDs</non-jta-data-source>   

    <properties> 
     <property name="eclipselink.session.customizer" value="com.company.yourproject.yourpackage.JPAEclipseLinkSessionCustomizer"/>   
    </properties> 

</persistence-unit> 

您只需要爲Apache Tomcat提供此解決方法。

+1

給出的鏈接沒有響應。我在http://code.google.com找到了該文件的副本。COM/P /行話/源/瀏覽/中繼/流行語/行家/流行語/ SRC /主/ JAVA/COM /行話/ utils的/ JPAEclipseLinkSessionCustomizer.java – 2013-10-01 09:28:31

1

設置數據源的URL爲「jdbc/myDs」
<non-jta-data-source>jdbc/myDs</non-jta-data-source>

+0

這會導致另一個異常:javax.naming.NameNotFoundException:名稱JDBC是不是在這方面 在org.apache.naming.NamingContext.lookup(NamingContext.java:770) 在org.apache.naming.NamingContext約束。在org.eclipse.persistence處的javax.naming.InitialContext.lookup(InitialContext.java:396) 處的org.apache.naming.SelectorContext.lookup(SelectorContext.java:121) 查找(NamingContext.java:140) 。 sessions.JNDIConnector.connect(JNDIConnector.java:110) at org.eclipse.persistence.sessions.JNDIConnector.connect(JNDIConnector.java:94) – 2010-09-20 13:31:21

1

我希望你能解決給出的意見問題...

我通過增加一個屬性「javax.persistence.nonJtaDataSource」具有相同的值作爲元素修復non-jta-data-source

0

2015年實現:我不確定Eclipselink SessionCustomizer是必需的。在我的測試中,所有工作都沒有(Tomcat 7.x,Java 7.x,Eclipselink 2.4.x)。

一些較舊的材料提出了Tomcat 5/6的特定問題以及解決問題的特殊方法。