2013-02-18 12 views
5

używam następujące klasy BeanJNDI wyszukiwanie nie działa z EJB 3.x

@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"; 
} 

} 

A moja metoda jest

public String myMethod() { 

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

Tu Dostaję

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

Nazwa odnośnika JNDI "UserBean" wydaje się być poprawna. Nie mam pojęcia, na czym polega problem. Czy ktoś może ci pomóc? Wdrożyłem moją aplikację na weblogic 12c, używając JPA 2.0 i EJB 3.x

Z góry dziękuję.

Odpowiedz

4

Problemem było używałem zdalny interfejs. Korzystanie prostu @stateless adnotacji bez odwzorowanym nazwy Poniższy kod działa:

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

Dzięki @Andre!

1

To może być lepszy pomysł, aby skorzystać z przenośnym Nazwa JNDI, to znaczy tylko opisywanie z @Stateless

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

+0

Próbowałem z adnotacją, jak tylko „@Stateless”. Moja nazwa EAR to Aahar_v.0.1, a moja nazwa modułu EJB to Aahar_EJB_v.0.1, więc wypróbowałem nazwę JNDI jako "java: Aahar_v.0.1/Aahar_EJB_v.0.1/User" i nadal otrzymuję komunikat "javax.naming.NameNotFoundException" : Nie można rozwiązać "java: global.Aahar_v.0.1.Aahar_EJB_v.0.1.User". Rozwiązano "java: global.Aahar_v.0.1.Aahar_EJB_v.0.1"; pozostała nazwa "Użytkownik" Czy robię coś nie tak? – Aditya

+0

Czy potrzebujesz zdalnego interfejsu, tzn. Czy musisz szukać poza serwerem aplikacji? Jeśli nie, upuść interfejs – Andre

+0

Problem polegał na tym, że korzystałem z interfejsu zdalnego. Korzystanie prostu @stateless adnotacji bez odwzorowanym nazwy Poniższy kod przepracowanych: nowego InitialContext() odnośnika ("java: global/NazwaProjektu/ModuleName/FullyQualifiedNameOfRemoteInterface BeanName."); Dzięki @Andre! – Aditya

1

Chociaż na to pytanie odpowiedziano dwa lata temu, chciałbym dodać komentarz na ten temat. Nie powinno być problemu z używaniem atrybutu mappedName. Jeśli wdrażasz w WebLogic, musisz dodać #[fully.qualified.interface.name] w swoim odnośniku.

np. mappedName = "UserBean", EJB wdraża interfejs o nazwie MyInterface w com.acme.user pakietu, a następnie odnośnika będzie jak

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