4

JSP / Hibernate プロジェクトを GWT / Hibernate に移行しようとしています。簡単に言うと、この問題は、jetty-env.xml の MysqlConnectionPoolDataSource クラスが明らかにインスタンス化されていないため、web.xml からのリソース参照が失敗しているように見えます。

Hibernate のセットアップは、GWT 以外のプロジェクトでも問題なく動作します。Eclipse Indigo、Google Suite Plugin 2.5、Google GWT Designer 2.4.2 を使用しています。

以下は、私が行った手順と、重要と思われるファイルの抜粋です。(前もってお詫び申し上げます。これは少し冗長ですが、私の質問が完全で明確であることを確認したかったのです。)

私の war/WEB-INF/classes/hibernate.cfg.xml には以下が含まれます。

<property name="hibernate.connection.datasource">
    java:comp/env/jdbc/nndb
</property>

web.xml には以下が含まれます。

<resource-ref>
    <description>NN Database Connection Pooling</description>
    <res-ref-name>jdbc/nndb</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
    <res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>

ここで説明されているように CustomJettyLauncher も作成し、それを使用するために Eclipse 実行構成を追加しました (Run Config Arguments -server com....CustomJettyLauncher)。

jetty-6.1.x [警告] NN データベース接続プールでの構成の問題 jdbc/nndbjavax.sql.DataSourceContainerShareable java.lang.IllegalStateException: Nothing to bind for name javax.sql.DataSource/default

おそらくこの時点で、jetty-env.xml にリソースを定義するエントリが必要です。

<?xml version="1.0"?> <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd">
<Configure class="org.mortbay.jetty.webapp.WebAppContext">
    <New id="nndb" class="org.mortbay.jetty.plus.naming.Resource">
        <Arg>jdbc/nndb</Arg>
        <Arg> 
            <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
               <Set name="Url">jdbc:mysql://dbserver/dbname</Set>
               <Set name="User">dbuser</Set>
               <Set name="Password">dbpasswd</Set>
            </New>
        </Arg>
   </New>
</Configure>

しかし、上記のエラー (名前 javax.sql.DataSource/default にバインドするものがありません) は残ります。興味深いことに、jetty-env.xml のデータソース クラス名を意図的に盗聴した場合 (たとえば、NOSUCH.com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource) は不満がないため、そのクラスをインスタンス化しようとさえしていない可能性があります。(WebAppContext および Resource DO の同様の「トレーサー」エラーは不満を生成するため、インスタンス化を試みていないのは ConnectionPoolDataSource のみです。)

うわー!

誰が何が悪いのか分かりますか?任意の推奨事項をいただければ幸いです。

前もって感謝します!

4

3 に答える 3

2

プロジェクトコードで遊んだ後、答えを完全に変更する必要がありました。ここに新しいものがあります:

たまたま以前のバージョンの GWT から Jetty Launcher コードを使用していたと思います (私は信じています)。あなたCustomJettyLauncherのバージョンを私が持っていたバージョン (同じ推奨事項に従って変更されていますが、GWT 2.4 コードベースのバージョンの上に変更されています) に置き換えると、すべてがまとめられました。初期コンテキスト、java:comp/envなどの適切な初期化。

java:comp/env名前にを追加すると、実際にバージョンを 6.1.11 でも動作させることができますが、jetty-env.xmlそのルートに行くのは意味がないと思います。6.1.26 で動作させることができませんでしたが、適切な Jetty Launcher コードベースを使用するとどちらのバージョンでも動作するため、問題はありません。

機能するランチャー コードは次のとおりです (パッケージ名とクラス名はそのままなので、「ドロップイン」置換です): https://gist.github.com/2854726


後でこの投稿に出くわす可能性のある誰かのために道を残します. ログ レベルで GWT を起動することにより、Jetty がDEBUGGWT ホスト (dev) モードでログを表示するようになります。SPAM

于 2012-06-01T20:54:49.437 に答える
1

コメントで話し合った後、問題を再現できるかどうかを確認するために、ローカルで単純な「HelloWorld」を構築することにしました。私はいくつかのフープを経験しなければなりませんでしたが、あなたが説明したものではありませんでした。クラスパスに競合するバージョンのjettyライブラリがあるかどうか疑問に思います。たとえば、ここでこの質問を見てください。念のため、GWTホストモード、クラスの読み込み、Hibernate(ここでは、もっともっと)に関連する他の問題に対処する必要がありました。これですべてが明確になり、私の簡単な例が機能しています。

ケースに戻ります。パッチが適用されたJettyランチャーを調べて、GWTがJettyのロギングサブシステムに対して何をしているかを理解しました。JettyTreeLoggerインナークラスを見てください。INFO以下のすべてをに送信しますSPAM。ログレベルでGWTアプリを実行しない限りSPAM、ケースを診断するために必要な「貴重な」Jetty出力は表示されません。そのため、実行構成([GWT]タブ)でSPAMログレベルをオンにするか、Jettyログメッセージを飲み込まないように、既にパッチが適用されているランチャーにさらにパッチを適用します

独自のJettyLauncherをセットアップし、ログレベルのSPAMでGWTを実行する手順を実行すると、コンソールに次のように表示されます。

...
Created java:comp/env for webapp /
Finding global env entries
...
parse: file:/.../JettyHibernateExample/war/WEB-INF/jetty-env.xml
...
loaded class com.mysql.jdbc.jdbc2.optional.MysqlDataSource from ContextLoader@null
XML new class com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
...
XML new class org.mortbay.jetty.plus.naming.Resource
...
Looking up name="jdbc"
Looking up binding for jdbc for context=env
...
Subcontext jdbc created
Adding binding with key=nndb obj=Reference Class Name: com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource

構成を正常に解析し、作成されたオブジェクトを適切にバインドします。さらにログで:

May 30, 2012 5:27:33 PM org.hibernate.cfg.Configuration configure
INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml
...
DEBUG org.hibernate.cfg.Configuration -
hibernate.connection.datasource=java:comp/env/jdbc/nndb
...
DEBUG org.hibernate.internal.SessionImpl - Opened session at timestamp
DEBUG org.hibernate.internal.SessionImpl - Disconnecting session
DEBUG o.h.e.j.i.LogicalConnectionImpl - Releasing JDBC connection

ASessionFactoryは正常にインスタンス化され、Session開かれ、その後切断されました。ここからすべてが良いと仮定して、それ以上テストしませんでした。

これが私が持っている依存関係のリストですWEB-INF/lib

antlr-2.7.7.jar
dom4j-1.6.1.jar
gwt-servlet.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.3.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-validator-4.1.0.Final.jar
javassist-3.15.0-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
jetty-naming-6.1.11.jar
jetty-plus-6.1.11.jar
logback-classic-1.0.1.jar
logback-core-1.0.1.jar
mysql-connector-java-5.1.20-bin.jar
report
slf4j-api-1.6.4.jar
validation-api-1.0.0.GA.jar

ログをオンにして、最終的に何が邪魔になるかがわかることを願っています。さらにサポートが必要な場合は、どこかで共有してください。

更新これで、ログファイルを検査できるようになり、さらに推奨事項を作成し始めます。私が最初に気付いたのは、あなたweb.xmlが要素のDTD順序に従っていないようだということです。、、、およびの後にresource-ref行く必要があります。しかし、これは問題ではないようです。servletservlet-mappingwelcome-file-list

あなたが言うとき、あなたが正確に何を意味するのか教えていただけますか

@異なるバージョン:プロジェクトクラスパス:6.1.26、ただしWEB-INF/libの6.1.11

クラスパスが問題にならないようにしたいのですが、実行時に複数の突堤JARが競合しないようにします。.classpathにあるものの完全なリストと一緒にプロジェクトファイルを共有してくださいWEB-INF/lib

UPDATE2ログファイルと私のイベントのシーケンスの違いを理解しました。追いかけます。

Jetty 6.1.11の場合:

public void configureWebApp() throws Exception
{
    //create a java:comp/env
    createEnvContext();

    //add java:comp/env entries for any globally defined EnvEntries
    bindGlobalEnvEntries();

    //set up java:comp/env as the Context in which to bind directly
    //the entries in jetty-env.xml
    NamingEntry.setScope(NamingEntry.SCOPE_LOCAL);

    //check to see if an explicit file has been set, if not,
    //look in WEB-INF/jetty-env.xml
    ....
}

桟橋6.1.26にいる間:

public void configureWebApp() throws Exception
{
    //check to see if an explicit file has been set, if not,
    //look in WEB-INF/jetty-env.xml
    ...
}

コンテキストの作成は次の場所に移動します。

public void configureDefaults() throws Exception
{        
    //create a java:comp/env
    createEnvContext();
}

そしてそれは設定されませんSCOPE_LOCALSCOPE_LOCALルートコンテキストがないと、本来あるjava:comp/envべき姿とは異なります。6.1.26(plusおよびnaming)で実行すると、「問題のある」ことがわかります。

Looking up binding for __ for context=null

とはいえ、とにかくうまく機能します。その「スコープ」ロジックは現在、他の場所に存在している必要があり、6.1.26(および以前のバージョンのどこにも競合するクラスがない)がある限り、問題なく動作するはずです。あなたが持っている場所:

Looking up name="__/jdbc/nndb"
Looking up binding for __ for context=null
InitialContextFactory.getInitialContext()
Created initial context delegate for local namespace:org.mortbay.naming.local.localContextRoot@237c8a9c
InitialContextFactory.getInitialContext()
Created initial context delegate for local namespace:org.mortbay.naming.local.localContextRoot@457019f7
Looking up name="Server@1c9e8392/__/javax.sql.DataSource/default"

私は持っています:

   Looking up name="__/jdbc/nndb"
   Looking up binding for __ for context=null
   Looking up name="jdbc/nndb"
   Looking up binding for jdbc for context=__
   Looking up name="nndb"
   Looking up binding for nndb for context=jdbc
   InitialContextFactory.getInitialContext()
   Created initial context delegate for local namespace:org.mortbay.naming.local.localContextRoot@1830f66
   >>> new root context requested 
   Looking up name="comp/env"
   Looking up binding for comp for context=null
   Using classloader of current org.mortbay.jetty.handler.ContextHandler
   Looking up name="env"
   Looking up binding for env for context=comp
   Binding java:comp/env/jdbc/nndb to jdbc/nndb

とはいえ、クラスパスをまっすぐにして、6.1.11または6.1.26を実行していることを確認し、2つの混合物ではないことを確認してください。それはそれをするべきです。後もう一つ。を使用してカスタムJNDIのもの(オブジェクトファクトリなど)を持ち込まないようにしてくださいWEB-INF/classes

于 2012-05-30T22:04:31.033 に答える