7
votes

EJB - LOCKUP a échoué pour 'EJB / BookRequestbean'

Je suis nouveau à l'EJB et j'essayais "Hello World" type de programme Java EJB. Voici mon EJB:

    Properties prop = new Properties();
    prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
    prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
    prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
    try {
        InitialContext ctx = new InitialContext(prop);                              
        ctx.lookup("ejb/BookRequestBean");
        System.out.println("EJB Look-up successfull!!");
    } catch (NamingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


1 commentaires

Full StackTrace aiderait. Assurez-vous également de regarder ceci: Glassfish.java.net/javaee5/ejb/ Ejb_faq.html # pojolocalejb


4 Réponses :


8
votes

Il peut y avoir plusieurs raisons à ceci:

1) Votre EJB n'est pas mappé sur jndi nom. Vous devez vérifier si votre EJB est déployé avec succès et il est mappé sur jndi nom. Vous pouvez vérifier GUI , Connexion au serveur sur le démarrage ou utiliser client de test universel pour voir si EJB est mappé correctement . Remarque, UTC ne montrera que exposé à distance éjbs.

2) Votre EJB est uniquement exposé à application locale . Dans ce cas, appel à distance ou Appel d'application croisé (autre oreille, guerre ...) à votre EJB échouera. Dans ce scénario, créez interface distante et l'expose. Interface locale expose EJB aux appels locaux uniquement. Interface distante expose EJB à Télécommande ou Appels d'application croisée . .

3) Votre rmi / iop port peut être incorrect. Vous pouvez vérifier Glassfish GUI ou Startup Server LOG Pour voir ce que port rmi / iop est attribué à.

Note: Pour diagnostiquer le problème exact, veuillez poster une trace de pile complète.


0 commentaires

2
votes

En plus de Nice @Ravitrivei Réponse, voici quelques réflexions:

  • @Named Annotation ne doit pas être utilisé de cette façon
  • n'utilise pas les deux nom et MappeName , pour Glassfish, il suffit d'utiliser juste MappeName
  • Votre EJB doit implémenter une interface distante

2 commentaires

Légère interjection. Nom est utilisé pour identifier EJB here que MappeName est le nom JNDI de EJB. Aussi mappeName est spécifique au fournisseur. IE: Supports de gishfish, WebSphere non.


@Ravitrivedi Yep, c'est pourquoi j'ai noté que cela suffit pour les poissons de verre. Il ne doit pas être utilisé si vous souhaitez des applications entièrement portables.



2
votes

Ajout à @Ravi Trivedi et @miljen Mikic, si vous utilisez Glassfish, vous devriez vérifier comment votre EJB est enregistré dans JNDI. Dans Glassfish, par exemple, tapez la commande suivante: xxx


0 commentaires

0
votes
**This Remote interface (the only addition to your above code);**        
            import javax.ejb.Remote;
            
            @Remote
            public interface BookRequestI {
                //Other codes here
                String getISBN();
            }
            
            **your existing implementation spiced with my getISBN() to prove the point :)**
            
            import javax.ejb.Stateless;
            
            
            @Stateless(name="BookRequestBean", mappedName="ejb/BookRequestBean")
            public class BookRequest implements BookRequestI {
                //Other codes here
                @Override
                public String getISBN(){
                    return "ISBN 87 - 11 - 07559 - 7";
                }
            }
            
            **your test as is with my getISBN and typing to interface Type.**
            
            import javax.naming.Context;
            import javax.naming.InitialContext;
            import javax.naming.NamingException;
            import java.util.Properties;
            
            public class BookRequestT {
            
                public static void main(String[] args) {
                   Properties prop = new Properties();
                    prop.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.enterprise.naming.SerialInitContextFactory");
                    prop.setProperty("org.omg.CORBA.ORBInitialHost", "localhost");
                    prop.setProperty("org.omg.CORBA.ORBInitialPort", "3700");
                    try {
            
                        Context ctx = new InitialContext(prop);
                        BookRequestI bookRequest = (BookRequestI) ctx.lookup("ejb/BookRequestBean");
                        System.out.println("EJB Look-up successfull!!" +  bookRequest.getISBN());
                    } catch (NamingException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
            
                }
            }
            
            output:
            EJB Look-up successfull!!ISBN 87 - 11 - 07559 - 7
            
            Process finished with exit code 0

0 commentaires