2013-02-18 9 views
5

ich folgende Bean Klasse bin mit:JNDI-Lookup nicht mit EJB 3.x arbeiten

@Stateless(name="UserBean", mappedName="UserBean") 
@LocalBean 
public class User implements UserRemote { 

@PersistenceContext 
private EntityManager em; 

public User() { 

} 

public String login(String username, String password) { 

    Query query = em.createQuery("..."); 
    return "xyz"; 
} 

} 

Und meine Methode ist

public String myMethod() { 

    try { 
     User user = (User) new InitialContext().lookup("UserBean"); 
     return "xyz"; 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } 
    return null;   
} 

Hier erhalte ich eine

javax.naming.NameNotFoundException: Unable to resolve 'UserBean'. Resolved ''; remaining name 'UserBean' 

Der JNDI-Lookup-Name 'UserBean' scheint korrekt zu sein. Keine Ahnung, was das Problem ist. Kann mir bitte jemand helfen? Ich habe meine Anwendung auf Weblogic 12c mit JPA 2.0 und EJB 3.x

im Voraus bereitgestellt. Vielen Dank im Voraus.

Antwort

4

Das Problem war ich ein Remote Interface wurde mit. Verwenden Sie einfach die @stateless Annotation ohne zugeordneten Namen Der folgende Code hat funktioniert:

new InitialContext().lookup("java:global/ProjectName/ModuleName/BeanName!FullyQualif‌​iedNameOfRemoteInterface"); 

Dank @Andre!

1

Es könnte eine bessere Idee, um den Einsatz von Portable JNDI Namen zu machen, das heißt mit Anmerkungen versehen nur mit @Stateless

https://blogs.oracle.com/kensaks/entry/application_specified_portable_jndi_names

+0

ich mit dem Vermerk als nur ‚@Stateless‘ versuchte. Mein EAR-Name ist Aahar_v.0.1 und mein EJB-Modulname ist Aahar_EJB_v.0.1, also habe ich den JNDI-Namen als 'java: Aahar_v.0.1/Aahar_EJB_v.0.1/User' ausprobiert und bekomme immer noch 'javax.naming.NameNotFoundException : "Java: global.Aahar_v.0.1.Aahar_EJB_v.0.1.User" konnte nicht aufgelöst werden. Gelöst 'java: global.Aahar_v.0.1.Aahar_EJB_v.0.1'; verbleibender Name 'User' ' Mache ich etwas falsch? – Aditya

+0

Benötigen Sie eine Remote-Schnittstelle, d. H. Müssen Sie außerhalb des Anwendungsservers suchen? Wenn nicht, löschen Sie die Schnittstelle – Andre

+0

Das Problem war, dass ich eine Remote-Schnittstelle verwendet habe. einfach die @Stateless Anmerkung ohne zugeordneten Namen verwenden Der folgende Code funktioniert: new Initial() Lookup ("java: global/Projektname/Module/BeanName FullyQualifiedNameOfRemoteInterface."); Dank @Andre! – Aditya

1

Obwohl diese Frage vor zwei Jahren beantwortet wurde, möchte ich einen Kommentar dazu hinzufügen. Es sollte kein Problem bei der Verwendung des Attributs "mappedName" geben. Wenn Sie WebLogic bereitstellen, müssen Sie in Ihrer Suche #[fully.qualified.interface.name] hinzufügen.

z.B. mappedName = "UserBean", die EJB ist eine Schnittstelle namens MyInterface im Paket com.acme.user Implementierung, dann würde die Lookup sein wie

... = new InitialContext().lookup("UserBean#com.acme.user.MyInterface");