2016-03-29 24 views
0

EJBTest'imle bir sorunum var.JNDI Yok EJB alıcısı kullanabiliyor

WildFly'i yükledim ve yapılandırılmış kullanıcı yönetimi ve uygulama yönetimi.

Bir EJB 3.0 yazdı ve dağıtılabilir: Daha sonra

@Stateless 
@Remote(NewSessionBeanRemote.class) 
public class NewSessionBean implements NewSessionBeanRemote { 

    List<String> bookShielf; 

    /** 
    * Default constructor. 
    */ 
    public NewSessionBean() { 
     bookShielf = new ArrayList<String>(); 
    } 

    @Override 
    public void addBook(String bookName) { 
     bookShielf.add(bookName); 
    } 

    @Override 
    public List getBook() { 
     return bookShielf; 
    } 
} 

, bunu bağlamak için basit bir istemci yazdı:

Hem kullanıcı adı ve şifre uygulaması kullanıcı kimlik değil yönetimidir

private static void invokeStatelessBean() throws NamingException { 
    // Let's lookup the remote stateless calculator 
    NewSessionBeanRemote remoteEjb = lookupRemoteSessionBean(); 
    System.out.println("Obtained a remote stateless calculator for invocation"); 
    String bookName = "TEST book"; 
    remoteEjb.addBook(bookName); 
} 

private static NewSessionBeanRemote lookupRemoteSessionBean() throws NamingException { 

    final Hashtable jndiProperties = new Hashtable(); 
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
    jndiProperties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:10090"); 
    jndiProperties.put(Context.SECURITY_PRINCIPAL, "ejb"); //this is the application user name, not management! it's correct? 
    jndiProperties.put(Context.SECURITY_CREDENTIALS, "ejb");//this is the application password, not management! it's correct? 
    jndiProperties.put("jboss.naming.client.ejb.context", true); 
    final Context context = new InitialContext(jndiProperties); 
    final String appName = ""; 
    final String moduleName = "EjbComponent"; 
    final String distinctName = ""; 
    final String beanName = NewSessionBean.class.getSimpleName(); 
    final String viewClassName = NewSessionBeanRemote.class.getName(); 
    System.out.println("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName); 
    return (NewSessionBeanRemote) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName); 
} 
! Doğru mu?

bu hatayı alıyorum:

Exception in thread "main" java.lang.IllegalStateException: EJBCLIENT000025: No EJB receiver available for handling [appName:, moduleName:EjbComponent, distinctName:] combination for invocation context [email protected] at org.jboss.ejb.client.EJBClientContext.requireEJBReceiver(EJBClientContext.java:798) at org.jboss.ejb.client.ReceiverInterceptor.handleInvocation(ReceiverInterceptor.java:128) at org.jboss.ejb.client.EJBClientInvocationContext.sendRequest(EJBClientInvocationContext.java:186) at org.jboss.ejb.client.EJBInvocationHandler.sendRequestWithPossibleRetries(EJBInvocationHandler.java:255) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:200) at org.jboss.ejb.client.EJBInvocationHandler.doInvoke(EJBInvocationHandler.java:183) at org.jboss.ejb.client.EJBInvocationHandler.invoke(EJBInvocationHandler.java:146) at com.sun.proxy.$Proxy2.addBook(Unknown Source) at com.studio.java.client.EjbTester.invokeStatelessBean(EjbTester.java:34) at com.studio.java.client.EjbTester.main(EjbTester.java:21)

Nedenini bilmiyorum! Bir fikri olan var mı?

cevap

2

Belirtilen hatayı alıyorsunuz çünkü mutlak JNDI adını kullanarak uzak bir EJB'ye erişmeye çalışıyorsunuz. documentation tarafından belirtildiği gibi

: alarak nedenle

JNDI bindings for session bean named NewSessionBean in deployment unit deployment <your_deployment_unit> are as follows: 

    java:global[/<application_name>]/<module_name>/<ejb_name>[!<interface_name>] 
    java:app[/<module_name>]/<ejb_name>[!<interface_name>] 
    java:module/<ejb_name>[!<interface_name>] 
    java:jboss/exported[/<application_name>]/<module_name>/<ejb_name>[!<interface_name>] 
    java:global/[/<application_name>]/<module_name>/<ejb_name> 
    java:app[/<module_name>]/<ejb_name> 
    java:module/<ejb_name> 

: Eğer WildFly üzerinde uygulama dağıtımını gerçekleştirdikten sonra Yani

The http-remoting client assumes JNDI names in remote lookups are relative to java:jboss/exported namespace, a lookup of an absolute JNDI name will fail.

,, sunucu konsolunda böyle bir şey görmelisiniz java: jboss/exported bağlamında, EJB'nizi elde etmenin doğru yolu:

// Normally the appName is the EAR name 
// Leave it empty if your application isn't packaged in a EAR 
String appName = "your_application_name/"; 
// The EJB module name 
String moduleName = "ejb_module_name/"; 
String beanName = NewSessionBean.class.getSimpleName(); 
String viewClassName = NewSessionBeanRemote.class.getName(); 

(NewSessionBeanRemote) context.lookup(appName + moduleName + beanName + "!" + viewClassName); 

Daha fazla okumak için, Java EE JNDI Syntax'un yanı sıra WildFly's JNDI Reference'a da göz atmanızı öneririm.

Kimlik bilgileriniz ile ilgili olarak, EJB'nize erişebilmeniz için EJB'niz herhangi bir kimlik doğrulama gerektirmediğinden, bunlar gerekli değildir. Normalde, bu sadece örneğin, bir LDAP service provider kullanan bir uygulama olduğunda gereklidir.

+0

tamam! çok teşekkürler Aribeiro, ama şimdi java.lang.ClassCastException aldım: org.jboss.ejb.client.naming.ejb.EjbNamingContext, com.studio.java.NewSessionBeanRemote – reve

+0

için nasıl görüntülenemiyor? – aribeiro

+0

her zaman cast Exception :( – reve