2012-08-31 32 views
5

おはよう!私はJavaEE 6の新人です。次のチュートリアルを使用して開始プロジェクトを作成しようとしました:Creating and Running an Application Client on the GlassFish Server。私は4つのプロジェクトを段階的に作成しました。EJB Remote Interfaceを格納するJava SEのlib、EJBモジュール、そしてそれ以外の場合はチュートリアルで説明しています。Hello World!リモートステートレスセッションBean

マイプラットフォーム:

  • ディストリビュータID:Ubuntuの説明:Ubuntuの10.10リリース:10.10 コードネーム:マーベリック
  • jdk1.6.0_26
  • Netbean7.2
  • のGlassFishサーバー(201207171143の構築) 3+

私のリモートインターフェイス

package ejb.started; 
    //  
    import javax.ejb.Remote; 
    // 
    @Remote 
    public interface StartedSessionBeanRemote { 

     String getHelloWorld(); 

    } 

その実装:

package ejb.started; 
// 
import javax.ejb.Stateless; 
// 
@Stateless(name="StartedSessionBeanRemote") 
public class StartedSessionBean implements StartedSessionBeanRemote { 

    @Override 
    public String getHelloWorld() { 
     return ("Hello world, EJB!"); 
    } 

} 

そして、クライアントコード:

package startedentappclient; 
// 
import ejb.started.StartedSessionBeanRemote; 
import javax.ejb.EJB; 
// 
public class AppClientMain { 
    @EJB 
    private static StartedSessionBeanRemote startedSessionBean; 
    public static void main(String[] args) { 
     System.err.println("EJB: "+startedSessionBean.getHelloWorld()); 
    } 
} 

私はリモートクライアントPROJを実行しようとすると、私は次のような出力受信:

ant -f /home/ilya/Workspace/git/workspace/StartedEntAppClient -DforceRedeploy=false run 
init: 
EJBRemoteInterface.init: 
Deleting: /home/ilya/Workspace/git/workspace/EJBRemoteInterface/build/built-jar.properties 
EJBRemoteInterface.deps-jar: 
Updating property file: /home/ilya/Workspace/git/workspace/EJBRemoteInterface/build/built-jar.properties 
EJBRemoteInterface.compile: 
EJBRemoteInterface.jar: 
deps-jar: 
compile: 
library-inclusion-in-archive: 
dist: 
pre-run-deploy: 
Redeploying /home/ilya/Workspace/git/workspace/StartedEntAppClient/dist/StartedEntAppClient.jar 
Initializing... 
post-run-deploy: 
run-deploy: 
Copying 1 file to /home/ilya/Workspace/git/workspace/StartedEntAppClient/dist 
Copying 2 files to /home/ilya/Workspace/git/workspace/StartedEntAppClient/dist/StartedEntAppClientClient 
Warning: /home/ilya/Workspace/git/workspace/StartedEntAppClient/dist/gfdeploy/StartedEntAppClient does not exist. 
com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=startedentappclient.AppClientMain/startedSessionBean,Remote 3.x interface =ejb.started.StartedSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=ejb.started.StartedSessionBeanRemote,refType=Session into class startedentappclient.AppClientMain: Lookup failed for 'java:comp/env/startedentappclient.AppClientMain/startedSessionBean' 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} 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:703) 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:470) 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectClass(InjectionManagerImpl.java:213) 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectClass(InjectionManagerImpl.java:205) 
    at org.glassfish.appclient.client.acc.AppClientContainer$ClientMainClassSetting.getClientMainClass(AppClientContainer.java:625) 
    at org.glassfish.appclient.client.acc.AppClientContainer.getMainMethod(AppClientContainer.java:517) 
    at org.glassfish.appclient.client.acc.AppClientContainer.completePreparation(AppClientContainer.java:411) 
    at org.glassfish.appclient.client.acc.AppClientContainer.prepare(AppClientContainer.java:319) 
    at org.glassfish.appclient.client.AppClientFacade.prepareACC(AppClientFacade.java:278) 
    at org.glassfish.appclient.client.acc.agent.AppClientContainerAgent.premain(AppClientContainerAgent.java:82) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323) 
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:338) 
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/startedentappclient.AppClientMain/startedSessionBean' 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: Exception resolving Ejb for 'Remote ejb-ref name=startedentappclient.AppClientMain/startedSessionBean,Remote 3.x interface =ejb.started.StartedSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=ejb.started.StartedSessionBeanRemote,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote' [Root exception is javax.naming.NamingException: Lookup failed for 'ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote' 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.NameNotFoundException: ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote not found]]] 
    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:392) 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:599) 
    ... 15 more 
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=startedentappclient.AppClientMain/startedSessionBean,Remote 3.x interface =ejb.started.StartedSessionBeanRemote,ejb-link=null,lookup=,mappedName=,jndi-name=ejb.started.StartedSessionBeanRemote,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote' [Root exception is javax.naming.NamingException: Lookup failed for 'ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote' 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.NameNotFoundException: ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote not found]] 
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:191) 
    at com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1109) 
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:776) 
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744) 
    at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:169) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) 
    ... 18 more 
Caused by: javax.naming.NamingException: Lookup failed for 'ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote' 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.NameNotFoundException: ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote not found] 
    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:392) 
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:186) 
    ... 23 more 
Caused by: javax.naming.NameNotFoundException: ejb.started.StartedSessionBeanRemote#ejb.started.StartedSessionBeanRemote not found 
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:248) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:215) 
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) 
    at com.sun.enterprise.naming.impl.RemoteSerialContextProviderImpl.lookup(RemoteSerialContextProviderImpl.java:109) 
    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 com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:144) 
    at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:174) 
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:528) 
    at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:199) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1624) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:1486) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleInput(CorbaMessageMediatorImpl.java:990) 
    at com.sun.corba.ee.impl.protocol.giopmsgheaders.RequestMessage_1_2.callback(RequestMessage_1_2.java:214) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequest(CorbaMessageMediatorImpl.java:742) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.dispatch(CorbaMessageMediatorImpl.java:539) 
    at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.doWork(CorbaMessageMediatorImpl.java:2324) 
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497) 
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540) 
Java Result: 1 
run: 
BUILD SUCCESSFUL (total time: 11 seconds) 

私はその問題が何であるか推測できません。私は2番目のPCで同じプロジェクトを構築し、すべて正常に動作します。それには同じソフトウェアプラットフォームがあります。

+0

チュートリアルには欠陥があります。彼らはエンタープライズアプリケーションを作成することを提案します。 EJBモジュールを作成するだけであれば、宣言したとおりに動作するはずです。参照:http://stackoverflow.com/questions/25828542/how-to-create-a-remote-session-ejb-from-a-client/25829907#25829907 – Thufir

答えて

4

あなたが書いた:

@EJB 
private static StartedSessionBeanRemote startedSessionBean; 

は、あなたのクライアントは、そのEJBのinjectionを実行しようとします。あなたの場合、明らかに成功しなかった:明らかに成功しなかった:

com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject... 

マップされた構造を使用すると、あなた自身が助けることができます。次のようにあなたのコードのこれらの行を書き換え:

@Stateless(mappedName="ejb/StartedSessionBeanRemote") 
public class StartedSessionBean implements StartedSessionBeanRemote { 

@EJB(mappedName="ejb/StartedSessionBeanRemote") 
private static StartedSessionBeanRemote startedSessionBean; 

EJBクライアントなしでそれを注入することはできませんので、最後に、あなたのEJBがクライアントの前に展開されていることを確認してください:)

+0

はい、アプリクライアントとエンタープライズを展開するのを忘れていましたアプリ)私はそれを修正し、すべてが働き始めた。ありがとう! – ilya8891

+0

しかし、今は私のために働いています。 Yar .....私は多くの例を試みたが、 'Remote Ejb'を注入しなかった。私はhttps://netbeans.org/kb/docs/javaee/entappclientに行きました。html#Exercise_32 example – Yubaraj

4

mainメソッドの@EJBアノテーションを使用してEJBにアクセスすることはできません。なぜなら、そのメソッドはサーバーによって管理されていないからです。代わりに、JNDIを使用する必要があります。

How do I access a Remote EJB component from a stand-alone java client?

+0

ありがとうございました。私が書いたように、私はincomerです。だから、私はJavaEEとJavaBeansに関連するすべての有益な資料に感謝の意を表します。 – ilya8891

+1

@carcaret:スタンドアロンのJavaアプリケーションの場合はそうですが、Enterprise Application Clientの場合はilya8891の質問に記載されています。あなたは通常、ここで注射を使用することができます。 –

+0

デッドリンク...... – Thufir