0

HSQLDB と Jetty を使用して、次のサンプル プロジェクトを自分のシステムで動作させることができました。

次に、JNDI を使用してデータ ソースを参照するようにプロジェクトを変換したいと考えました。まず、次の resource-ref を my に追加しましたweb.xml

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

次に、次のデータ ソースを$JETTY_HOME/etc/jetty.xmlファイルに追加しました。

<New id="mydatasource" class="org.eclipse.jetty.plus.jndi.Resource">
    <Arg></Arg>
    <Arg>jdbc/mydatasource</Arg>
    <Arg>
        <New class="org.hsqldb.jdbc.JDBCDataSource">
            <Set name="Url">file:mytestdb</Set>
            <Set name="User">SA</Set>
            <Set name="Password"></Set>
        </New>
    </Arg>
</New>

...そして、次のコードを使用してデータ ソースを参照しました。

try {
    //con=DriverManager.getConnection("jdbc:hsqldb:mydatabase","SA","");

    InitialContext context = new InitialContext();
    DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/mydatasource");
    con = dataSource.getConnection();

    con.createStatement().executeUpdate("create table contacts (name varchar(45),email varchar(45),phone varchar(45))");
} catch (NamingException ne) {
    ne.printStackTrace(System.out);
} catch (SQLException e) {
    e.printStackTrace(System.out);
}

次に、アプリを展開されたディレクトリとしてデプロイし、Jetty プロセスを開始しようとしました。実行すると、クラッシュし、次のエラー メッセージが表示されました。

# tom at toshi in ~/Downloads/jetty-distribution-9.0.4.v20130625 [19:41:34]
$ java -jar ./start.jar                                                                                    <<<
2013-07-07 19:41:39.335:WARN:oejx.XmlConfiguration:main: Config error at <Set name="Password"/> java.lang.refle
ct.InvocationTargetException in file:/home/tom/Downloads/jetty-distribution-9.0.4.v20130625/etc/jetty.xml
2013-07-07 19:41:39.349:WARN:oejx.XmlConfiguration:main: Config error at <New id="mydatasource" class="org.ecli
pse.jetty.plus.jndi.Resource"><Arg/><Arg>jdbc/mydatasource</Arg><Arg>|            <New class="org.hsqldb.jdbc.J
DBCDataSource"><Set name="Url">file:mytestdb</Set><Set name="User">SA</Set><Set name="Password"/></New>|       
 </Arg></New> java.lang.reflect.InvocationTargetException in file:/home/tom/Downloads/jetty-distribution-9.0.4.
v20130625/etc/jetty.xml
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.eclipse.jetty.start.Main.invokeMain(Main.java:509)
        at org.eclipse.jetty.start.Main.start(Main.java:651)
        at org.eclipse.jetty.start.Main.main(Main.java:99)
        ...

OK、パスワード フィールドが空であることは好ましくありません。それで、私は私のでこの変更を加えてみましたjetty.xml

    <!--<Set name="Password"></Set>--> <!-- Got rid of this -->
    <Set name="Password" />

それでも同じエラーが発生しました。そこで、データ ソースから「Password」プロパティを削除すると、Jetty を起動できました。悪いニュースは、データベースを参照する何かをしようとすると、次のエラーが発生することです。

2013-07-07 19:49:09.682:WARN:jndi:qtp14895676-19: 
java.lang.Exception: org.hsqldb.jdbc.JDBCDataSource: invalid RefAddr: password
        at org.hsqldb.jdbc.JDBCDataSourceFactory.getObjectInstance(Unknown Source)
        at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:476)
        at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:518)
        at org.eclipse.jetty.jndi.local.localContextRoot.lookup(localContextRoot.java:533)
        at javax.naming.InitialContext.lookup(InitialContext.java:411)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:468)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
        at org.eclipse.jetty.jndi.NamingContext.lookup(NamingContext.java:536)
        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:411)
        at Register.init(Register.java:31)
        ...

その警告の後に、null ポインター例外が続きました。

したがって、HSQLDB ドライバーは、データ ソースにパスワード フィールドが存在することを期待しているようです。

これが私のキャッチ 22 です。データ ソースに空のパスワード フィールドがあると Jetty を起動できませんが、それを省略した場合、ドライバーは動作しません。

Jetty で空のパスワードを使用してデータ ソースを作成する方法を知っている人はいますか?

最後に、a) JNDI を使用しないか、b) SA ユーザーにパスワードを与えることができることを認識しています。ただし、私の特定のプロジェクトでは、JNDI を使用し、SA ユーザーにパスワードを与えないようにする必要があります。

4

2 に答える 2

0

おすすめフレッドありがとう!

jetty.xml ファイルで次のように空のパスワードを指定するだけで済みました。

...
<Set name="Password">""</Set>
...

その後、すべてが完璧に機能しました。

于 2013-07-09T02:30:05.040 に答える