2017-10-06 2 views
0

J'ai déployé une application EJB3 avec un module et un bean session appelés Données utilisateur dans Wildfly. Ceci est ma structure du projet: enter image description hereImpossible d'obtenir le bean à partir de l'application cliente

C'est le UserData Stateful Bean:

@Stateful 
@Remote(UserDataRemote.class) 
public class UserData implements UserDataRemote, UserDataLocal { 

    private String name; 

    /** 
    * Default constructor. 
    */ 
    public UserData() { 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void saveName(String name) { 
     // TODO Auto-generated method stub 
     this.name =name; 
    } 

    @Override 
    public String getName() { 
     // TODO Auto-generated method stub 
     return this.name; 
    } 

} 

Ceci est une culture de la console:

enter image description here

Voilà comment je suis en train pour le récupérer depuis une application via JNDI:

public static void main (String args[]) { 
    Properties jndiProperties = new Properties(); 
    jndiProperties.put("jboss.naming.client.ejb.context", true); 
    jndiProperties.put(Context.PROVIDER_URL, "http-remoting://127.0.0.1:8080"); 
    jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.remote.client.InitialContextFactory"); 
    try { 
     InitialContext namingContext = new InitialContext(jndiProperties); 
     UserDataRemote userRemote = (UserDataRemote)namingContext.lookup("java:global/testEJB/UserData!entities.UserDataRemote"); 

    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

** Mise à jour ** Je tente aussi d'utiliser cette url pour la recherche:

UserDataRemote userRemote = (UserDataRemote)namingContext.lookup("ejb:/testEJB//UserData!entities.UserDataRemote?stateful"); 

Mais il ne peut pas le trouver aussi bien.

C'est l'erreur que je reçois:

ott 06, 2017 7:45:51 AM org.xnio.Xnio <clinit> 
INFO: XNIO version 3.4.0.Final 
ott 06, 2017 7:45:51 AM org.xnio.nio.NioXnio <clinit> 
INFO: XNIO NIO Implementation Version 3.4.0.Final 
ott 06, 2017 7:45:51 AM org.jboss.remoting3.EndpointImpl <clinit> 
INFO: JBoss Remoting version 4.0.21.Final 
ott 06, 2017 7:45:52 AM org.jboss.ejb.client.remoting.VersionReceiver handleMessage 
INFO: EJBCLIENT000017: Received server version 2 and marshalling strategies [river] 
ott 06, 2017 7:45:52 AM org.jboss.ejb.client.remoting.RemotingConnectionEJBReceiver associate 
INFO: EJBCLIENT000013: Successful version handshake completed for receiver context EJBReceiverContext{[email protected], receiver=Remoting connection EJB receiver [connection=Remoting connection <13359fd6> on endpoint "config-based-naming-client-endpoint" <6536e911>,channel=jboss.ejb,nodename=macbook-pro-di-andrea]} on channel Channel ID 96d8a7d7 (outbound) of Remoting connection 1f36e637 to /127.0.0.1:8080 of endpoint "config-based-naming-client-endpoint" <6536e911> 
javax.naming.NameNotFoundException: global/testEJB/UserData!entities.UserDataRemote -- service jboss.naming.context.java.jboss.exported.global.testEJB."UserData!entities.UserDataRemote" 
    at org.jboss.as.naming.ServiceBasedNamingStore.lookup(ServiceBasedNamingStore.java:106) 
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:207) 
    at org.jboss.as.naming.NamingContext.lookup(NamingContext.java:184) 
    at org.jboss.naming.remote.protocol.v1.Protocol$1.handleServerMessage(Protocol.java:127) 
    at org.jboss.naming.remote.protocol.v1.RemoteNamingServerV1$MessageReciever$1.run(RemoteNamingServerV1.java:73) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
    at java.lang.Thread.run(Thread.java:748) 

Répondre

2

Si vous déployez directement le JAR EJB alors la recherche doit être

UserDataRemote userRemote = 
    (UserDataRemote) namingContext.lookup("testEJB/UserData!entities.UserDataRemote"); 

Si le JAR EJB est emballé dans un EAR alors vous devez ajouter le nom de EAR (nom de l'application)

UserDataRemote userRemote = 
    (UserDataRemote) namingContext.lookup("<ear-name>/testEJB/UserData!entities.UserDataRemote"); 
+0

Il est important de faire la distinction entre les déploiements dans les fichiers EAR ou JAR. Mais sans un "ejb": je ne pouvais pas accéder à mes haricots. – jaysee

+0

Jetez un oeil à un exemple de travail ici: https: // github.com/simasch/jbosseap7ejbdemo –

-1

Je suppose, vous devez utiliser d'autres valeurs pour jndiProperties et utiliser une autre valeur pour la recherche de l'EJB. J'ai adapté votre code ci-dessous.

public static void main (String args[]) { 
    Properties jndiProperties = new Properties(); 
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming"); 
    jndiProperties.put("jboss.naming.client.ejb.context", true); 

    try { 
     InitialContext namingContext = new InitialContext(jndiProperties); 
     UserDataRemote userRemote = (UserDataRemote)namingContext.lookup("ejb:/testEJB/UserData!entities.UserDataRemote"); 

    } catch (NamingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

La valeur de recherche donnée fonctionne pour EJB sans état qui sont déployés dans un fichier JAR (pas EAR-fichier). Si votre EJB est avec état, vous devez ajouter le "?stateful" suivant à la fin. La procédure de création de la valeur de recherche pour les fichiers EAR est décrite dans le lien ci-dessous.

Les liaisons JNDI montrées par mon serveur Wildfly sont similaires aux vôtres. Ils n'ont pas commencé avec ejb:.... Mais la recherche fonctionne néanmoins.

De plus, il devrait y avoir un fichier jboss-ejb-client.properties dans le classpath lors de l'exécution. Les classes de jboss-client.jar rechercheront ce fichier.

Voici le contenu de la mine:

endpoint.name=client-endpoint 
remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false 
remote.connections=default 

remote.connection.default.host=localhost 
remote.connection.default.port=8080 
remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false 

Vous pouvez trouver plus d'informations ici link.

+0

Cela ne fonctionne pas – Sindico

+0

Avez-vous déjà essayé l'exemple RemoteCalculator à partir du lien donné? Je pense que c'est un bon exemple pour permettre aux EJB de fonctionner. Pouvez-vous montrer une partie de votre code? – jaysee

+0

J'ai mis à jour la question – Sindico