2012-12-25 63 views
0

我一直希望通過JNDI通過Jetty(8.1.8.v20121106)嘗試兩個完整日期來使用HSQLDB公開數據源。大多數教程已過時:例如http://dinukaroshan.blogspot.com/2012/04/setting-up-jndi-with-jetty-embedded.html使用Jetty 6,這從使用的軟件包名稱(Mortbay而不是eclipse)中很明顯,或者他們只專注於jetty.xmljetty-env.xml文件,而不提供任何Java對他們怎麼消費類的配置文件中的代碼樣本這樣一個: http://wiki.eclipse.org/Jetty/Feature/JNDI#Example_Webapps使用HSQLDB數據源的Jetty 8(嵌入式)

在做這件事給了我下面的結果我的最好的嘗試:

java.lang.Exception: javax.naming.NameNotFoundException; remaining name 'env/jdbc/MySqlDS' 
    at wavemark.dcpcontroller.controllerws.db.DBProxy.getConnection(DBProxy.java:47) 
    at test.wavemark.dcpcontroller.controllerws.webservice.TestDCPControllerWS.getConnection(TestDCPControllerWS.java:97) 
    at org.dbunit.DatabaseTestCase.newDatabaseTester(DatabaseTestCase.java:85) 
    at org.dbunit.DatabaseTestCase.getDatabaseTester(DatabaseTestCase.java:109) 
    at org.dbunit.DatabaseTestCase.tearDown(DatabaseTestCase.java:164) 
    at test.wavemark.dcpcontroller.controllerws.webservice.TestDCPControllerWS.setUp(TestDCPControllerWS.java:33) 
    at junit.framework.TestCase.runBare(TestCase.java:132) 
    at junit.framework.TestResult$1.protect(TestResult.java:110) 
    at junit.framework.TestResult.runProtected(TestResult.java:128) 
    at junit.framework.TestResult.run(TestResult.java:113) 
    at junit.framework.TestCase.run(TestCase.java:124) 
    at junit.framework.TestSuite.runTest(TestSuite.java:232) 
    at junit.framework.TestSuite.run(TestSuite.java:227) 
    at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:83) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: javax.naming.NameNotFoundException; remaining name 'env/jdbc/MySqlDS' 
    at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:505) 
    at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536) 
    at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:551) 
    at org.eclipse.jetty.jndi.java.javaRootURLContext.lookup(javaRootURLContext.java:117) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at wavemark.dcpcontroller.controllerws.db.DBProxy.getConnection(DBProxy.java:43) 
    ... 19 more 

jetty.xml文件如下:

<?xml version="1.0"?> 
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"> 

<Configure id='wac' class="org.eclipse.jetty.server.Server"> 

    <!-- ============================================================== --> 
    <!-- Add the DataSource(s) only valid for this webapp below   --> 
    <!-- ============================================================== --> 

    <New id="MySqlDS" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg>jdbc/MySqlDS</Arg> 
    <Arg> 
     <Set name="driverClass">org.hsqldb.jdbcDriver</Set> 
     <!--<Set name="url">jdbc:hsqldb:sample</Set>--> 
     <Set name="user">sa</Set> 
     <Set name="password"></Set> 
    </Arg> 
    </New> 

</Configure> 

添加以下到我的web.xml(這恰好是一個Axis2 Web應用程序):

<resource-ref> 
    <res-ref-name>jdbc/MySqlDS</res-ref-name> 
    <res-type>javax.sql.DataSource</res-type> 
    <res-auth>Container</res-auth> 
    </resource-ref> 

這是我使用消耗碼頭配置的Java代碼:

public ServerManager(int webServerPort,String jettyConfigurationsFilePath, String webApplicationPath) throws Exception 
    { 
     System.out.println("Initializing server"); 
     this.webServerPort = webServerPort; 
     this.webApplicationPath = webApplicationPath; 

     server = new Server(webServerPort); 
     XmlConfiguration configuration = new XmlConfiguration(new File(jettyConfigurationsFilePath).toURI().toURL()); 
     configuration.configure(server); 
     System.out.println("Finished configuring Jetty Server..."); 

     System.out.println("Server initialized"); 
     System.out.println("Server state is now " + server.getState()); 
     WebAppContext webapp = new WebAppContext(); 
     webapp.setContextPath("/"); 
     webapp.setWar(webApplicationPath); 
     server.setHandler(webapp); 


    } 

我做錯了什麼?有沒有一個最新的教程可以讓我使用HSQLDB作爲我的DBMS,JNDI來公開數據源和Jetty8?

非常感謝您的幫助。

+0

您是否發現代碼中出現錯誤? – Soma

回答

2

這不是一個完整的答案,但是您提供的第二個wiki鏈接中顯而易見的一點是使用DataSource。將創建一個javax.sql.DataSource的實例。在給定的例子中,當使用HSQLDB代替Derby時,HSQLDB的設置如下所示:

<Configure id='wac' class="org.eclipse.jetty.webapp.WebAppContext"> 
... 
<New id="myds" class="org.eclipse.jetty.plus.jndi.Resource"> 
    <Arg><Ref id="wac"/></Arg> 
    <Arg>jdbc/mydatasource</Arg> 
    <Arg> 
    <New class="org.hsqldb.jdbc.JDBCDataSource"> 
     <Set name="DatabaseName">file:mytestdb</Set> 
     <Set name="User">SA</Set> 
     <Set name="Password"></Set> 
    </New> 
    </Arg> 
</New> 
</Configure>