1

Java EE を理解するために Netbeans を使用しています。「コードの挿入」と「エンタープライズ Bean の呼び出し」を使用して、プロジェクトに含まれるライブラリにインターフェイスがあるリモート Bean を取得します。私のプロジェクトが Web アプリケーション netbeans の場合、これを行うと次のような関数が挿入されます。(これは jndi ルックアップですよね?)

private CategoryBeanRemote lookupCategoryBeanRemote() {
    try {
        Context c = new InitialContext();
        return (CategoryBeanRemote) c.lookup("java:global/Shop2-ear/Shop2-database-ejb/CategoryBean!shop2.database.CategoryBeanRemote");
    } catch (NamingException ne) {
        Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
        throw new RuntimeException(ne);
    }
}

エンタープライズアプリケーションクライアントで同じことを行うと、netbeans はただ与えます

@EJB
private static BeverageBeanRemote beverageBean;

どうしてこれなの?

Web アプリケーションで 2 番目のものを手動で作成しようとすると、サーバーが次のようなエラーを返すのは正常ですか。

SEVERE: Unexpected error occurred
org.apache.wicket.WicketRuntimeException: Can't instantiate page using constructor 'public com.myapp.wicket.HomePage()'. Might be it doesn't exist, may be it is not visible (public).  
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:193)
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:66)
at org.apache.wicket.DefaultMapperContext.newPageInstance(DefaultMapperContext.java:133)
...
Caused by:
java.lang.reflect.InvocationTargetException     
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.apache.wicket.session.DefaultPageFactory.newPage(DefaultPageFactory.java:174)
... 40 more Caused by: java.lang.NullPointerException
at com.myapp.wicket.HomePage.<init>(HomePage.java:27) 
... 45 more
4

1 に答える 1

0

Java EE で本当に重要なのは構成です。残念ながら、IDE を使用しているときにアプリケーションを正しく構成する方法を学ぶのは非常に困難です (ただし、IDE を使用しない場合はおそらく難しいでしょう:P)

私は専門家ではありませんが...

私の推測では、クライアント アプリケーションを作成したら、それを何らかのエンタープライズ アプリケーションにバインドしたと思います。構成ファイルに保存されました。このようにして、クライアント アプリケーションはリモート Bean の場所を「認識」し、jndi ルックアップは必要ありません。

いくつかのチュートリアルを使用することをお勧めします (これにより、おそらく舞台裏で何が起こっているかがわかります) および/または SVN のようなリポジトリを作成し、IDE によるすべての操作の後、構成ファイルで何が変更されたかを確認します。

その上、あなたは完全なスタックトレースを出力していないように思えます...しかし、多分私は間違っています

于 2013-06-17T17:20:24.483 に答える