0

次のコードは、ユーザーの電子メールを指定して、データベースから写真の名前を取得します。

package NonServletFiles;
import javax.sql.*;
import java.sql.*;
import javax.naming.*;
public class GetPhotosForTheUser {

public ResultSet getData(String email) {
    ResultSet set = null;
    try {
        String sqlQuery = "select nameofthephoto from photocaptions where useremail='" + email + "'";
        Context context = new InitialContext();
        DataSource ds = (DataSource)context.lookup("java:comp/env/jdbc/photog"); // LINE 17
        Connection connection = ds.getConnection();
        PreparedStatement statement = connection.prepareStatement(sqlQuery);
        set = statement.executeQuery();
        while(set.next()){
            System.out.println("Name Of The Photo : " + set.getString("NameOfThePhoto"));
        }
    }catch(Exception exc) {
        exc.printStackTrace();
    }

    return set;
  }
}

.jspファイルからこのヘルパークラスを次のように呼び出すと:

    <% 
        GetPhotosForTheUser gpftu = new GetPhotosForTheUser();
        gpftu.getData("suhailgupta03@gmail.com");
    %>

サーバーコンソールに正しい名前を出力します。

mainしかし、メソッドを追加してこのクラスを単独で使用すると

ここに画像の説明を入力

そのヘルパー クラスでは、次のような例外がスローされます。

javax.naming.NamingException: Lookup failed for 'java:comp/env/jdbc/photog' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.url.pkgs=com.sun.enterprise.naming, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl} [Root exception is javax.naming.NamingException: Invocation exception: Got null ComponentInvocation ]
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455)
at javax.naming.InitialContext.lookup(InitialContext.java:411)
at NonServletFiles.GetPhotosForTheUser.getData(GetPhotosForTheUser.java:17)
at NonServletFiles.GetPhotosForTheUser.main(GetPhotosForTheUser.java:32)
    Caused by: javax.naming.NamingException: Invocation exception: Got null ComponentInvocation 
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.getComponentId(GlassfishNamingManagerImpl.java:873)
at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:742)
at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:172)
at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498)
... 4 more

なぜそれが起こるのですか?この開発にはグラスフィッシュサーバーとネットビーンズを使用しています。

4

2 に答える 2

3

これをWebアプリケーションとして実行すると、コンテキストがサーバーの詳細で初期化されます

Context context = new InitialContext(); // This is initialized when you run as web app

main メソッドを呼び出してスタンドアロン プログラムとして実行する場合、同じことは当てはまりません

コンテキストを初期化することでこれを取り除くことができます。

Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY, "your provider"); // like for websphere it is com.ibm.websphere.naming.WsnInitialContextFactory and weblogic weblogic.jndi.WLInitialContextFactory
prop.put(Context.PROVIDER_URL, "server path"); //
Context context = new InitialContext(prop);

注: 通常、そのように記述することはありません。代わりに、コードは WEBMODE または TEST で実行されているかどうかをチェックし、テストの場合は Context を初期化するか、そうでない場合は通常のコンテキストを使用します。

これによりコンテキストが初期化され、メイン メソッドから実行できるようになります。

編集:Glassfish の構成はhereから取得

  Properties props = new Properties();

  props.setProperty("java.naming.factory.initial", 
                    "com.sun.enterprise.naming.SerialInitContextFactory");

  props.setProperty("java.naming.factory.url.pkgs", 
                    "com.sun.enterprise.naming");

  props.setProperty("java.naming.factory.state",
                    "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl");


  // optional.  Defaults to localhost.  Only needed if web server is running 
  // on a different host than the appserver    
  props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");

  // optional.  Defaults to 3700.  Only needed if target orb port is not 3700.
  props.setProperty("org.omg.CORBA.ORBInitialPort", "3700");

  InitialContext ic = new InitialContext(props);
于 2012-05-23T14:19:51.557 に答える
0

main メソッドを使用して実行すると、Web アプリケーションとして実行されないため、Web アプリケーションのコンテキストがありません。

于 2012-05-23T14:17:31.980 に答える