2012-03-20 120 views
1

我試圖讓EJB與Glassfish v3一起工作。我正在使用Servlet開發Java EE Web應用程序。Glassfish的EJB JNDI

當我部署此Web應用程序到GlassFish,它註冊EJB類到

java:global JNDI樹。但是,當我嘗試將這個實例注入到我的

Servlet中時,我得到了NameNotFoundException

當我查看服務器的日誌時,Servlet會嘗試在java:comp/env中查找。

有人可以幫我解決這個問題嗎?

爲登錄部相關的代碼:

UserDao.java

@Local 
public interface UserDao { 
    public User find(Long id); 

    public List<User> findAll(); 

    public List<User> paginate(int offset, int nbentry) throws IllegalArgumentException, IllegalStateException; 

    public User findUserByUsernameAndPassword(String username, String password); 

    public User create(User user) throws UserException; 

    public User update(User user) throws UserException; 

    public Boolean delete(User user) throws UserException; 

    public int count(); 
} 

JpaUserDao.java

@Stateless 
public class JpaUserDao implements UserDao { 
    private Logger log = Logger.getLogger(JpaUserDao.class.getSimpleName()); 
    @PersistenceContext(unitName = "YouFood-PU") 
    private EntityManager em; 

    @Override 
    public User create(User user) throws UserException { 
     try { 
      em.persist(user); 
    } catch (Exception e) { 

     throw new UserException("Creation of the user: " + user 
       + " failed, please try later or contact the webmaster"); 
    } 

    return user; 
} 

@Override 
public User update(User user) throws UserException { 
    try { 
     em.persist(em.merge(user)); 
    } catch (Exception e) { 
     throw new UserException("Update of the user: " + user 
       + " failed, please try later or contact the webmaster"); 
    } 

    return user; 
} 

@Override 
public Boolean delete(User user) throws UserException { 
    try { 
     em.remove(em.merge(user)); 
     return true; 
    } catch (Exception e) { 
     throw new UserException("Deletion of the user: " + user 
       + " failed, please try later or contact the webmaster"); 
    } 
} 

@Override 
public User find(Long id) { 
    User user = new User(); 

    try { 
     user = em.find(User.class, id); 
     return user; 
    } catch (Exception e) { 
     return null; 
    } 
} 

@Override 
public User findUserByUsernameAndPassword(String username, String password) { 
    User user = null; 
    try { 
     log.info("findUserByUsernameAndPassword"); 
     user = (User) em 
       .createQuery(
         "SELECT u FROM User AS u where u.username = :username AND u.password = :password ") 
       .setParameter("username", username) 
       .setParameter("password", password).getSingleResult(); 
     return user; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     log.severe(e.getStackTrace().toString()); 
     return null; 
    } 
} 

@SuppressWarnings("unchecked") 
@Override 
public List<User> findAll() { 
    List<User> users = null; 
    try { 

     users = (List<User>) em.createQuery("SELECT u FROM User u") 
       .getResultList(); 
     return users; 
    } catch (Exception e) { 
     return null; 
    } 

} 

@SuppressWarnings("unchecked") 
@Override 
public List<User> paginate(int offset, int nbentry) 
     throws IllegalArgumentException, IllegalStateException { 
    List<User> users = null; 

    users = (List<User>) em.createQuery("FROM User").setFirstResult(offset) 
      .setMaxResults(nbentry).getResultList(); 

    return users; 
} 

@Override 
public int count() { 
    Number count; 

    count = (Number) em.createQuery("SELECT COUNT(u.id) FROM User") 
      .getSingleResult(); 

    return count.intValue(); 
} 
} 

Authenticator.java

@Stateless 
public class Authenticator { 

private String userFullName; 
private Long userId; 

@EJB 
private JpaUserDao userDao; 

public Authenticator() {} 

public AuthenticationError connect(String username, String password) 
     throws Exception { 

    String hashed_password = Authenticator.hash(password, "UTF-8"); 

    User user = null; 

    user = userDao.findUserByUsernameAndPassword(username, 
      hashed_password); 

    if (user == null) { 
     return AuthenticationError.UserNotFound; 
    } 

    this.userFullName = user.toString(); 
    this.userId = user.getId(); 

    return AuthenticationError.Success; 
} 

public Boolean disconnect(HttpSession session) throws Exception { 
    try { 
     session.invalidate(); 
     return true; 
    } catch (Exception e) { 
     return false; 
    } 

} 

public String getUserFullName() { 
    return this.userFullName; 
} 

public Long getUserId() { 
    return this.userId; 
} 

/** 
* 
* Static method 
* 
* @throws Exception 
* 
*/ 

public static String hash(String data, String charset) throws Exception { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    md.reset(); 
    md.update(data.getBytes(charset), 0, data.length()); 
    String hash = new BigInteger(1, md.digest()).toString(16); 
    return hash; 
} 

} 

LoginServlet.java

@WebServlet("/login") 
public class LoginServlet extends HttpServlet { 

private static final long serialVersionUID = 1L; 
private Logger log = Logger.getLogger(LoginServlet.class.getSimpleName()); 
@EJB 
private Authenticator auth; 

/** 
* @see HttpServlet#HttpServlet() 
*/ 
public LoginServlet() { 
    super(); 
    // TODO Auto-generated constructor stub 
} 

/** 
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    log.info("LoginServlet.deGet() call"); 
    request.getRequestDispatcher("/jsp/login.jsp").forward(request, response); 
} 

/** 
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
*/ 
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    //auth = new Authenticator(); 

    log.info("LoginServlet.dePost() call"); 
    String message = null; 
    String username = request.getParameter("username"); 
    String password = request.getParameter("password"); 

    log.info("username: " + username); 
    log.info("password: " + password); 

    try { 
     AuthenticationError status = auth.connect(username, password); 
     System.out.println(status); 
     switch (status) { 
      case PasswordMissMatch: 
       message = "Password missmatch"; 
       log.info(message); 
       request.setAttribute("error", message); 
       request.getRequestDispatcher("/jsp/login.jsp").forward(request, response); 
       break; 
      case Success: 
       message = "Your are successfully logged in"; 
       log.info(message); 
       request.setAttribute("success", message); 
       request.getSession().setAttribute("loggedIn", true); 
       request.getSession().setAttribute("full_name", auth.getUserFullName()); 
       request.getSession().setAttribute("user_id", auth.getUserId()); 
       break; 
      case UserNotFound: 
       message = "Username provided not found in our record"; 
       log.info(message); 
       request.setAttribute("error", message); 
       request.getRequestDispatcher("/jsp/login.jsp").forward(request, response); 
       break; 
     } 
    } catch (GeneralSecurityException e) { 

     message = e.getMessage(); 
     request.setAttribute("error", message); 

    } catch (Exception e) { 
     message = e.getMessage(); 
     request.setAttribute("error", message); 
    } 

    request.getRequestDispatcher("/home").forward(request, response); 
} 
} 

Glassfish的部署日誌

INFO: closing 
ATTENTION: DPL8027: Ignore WEB-INF/sun-web.xml in archive 
/Users/guillaume/Documents/workspace/Supinfo/YouFood/nbbuild/web/, as GlassFish 
counterpart runtime xml WEB-INF/glassfish-web.xml is present in the same 
archive. 

INFO: Processing PersistenceUnitInfo [ 
    name: YouFood-PU 
    ...] 
INFO: Binding entity from annotated class: com.youfood.entity.Menu 
INFO: Bind entity com.youfood.entity.Menu on table Menu 
INFO: Binding entity from annotated class: com.youfood.entity.DinningRoom 
INFO: Bind entity com.youfood.entity.DinningRoom on table DinningRoom 
INFO: Binding entity from annotated class: com.youfood.entity.Item 
INFO: Bind entity com.youfood.entity.Item on table Item 
INFO: Binding entity from annotated class: com.youfood.entity.TTable 
INFO: Bind entity com.youfood.entity.TTable on table TTable 
INFO: Binding entity from annotated class: com.youfood.entity.Zone 
INFO: Bind entity com.youfood.entity.Zone on table Zone 
INFO: Binding entity from annotated class: com.youfood.entity.Country 
INFO: Bind entity com.youfood.entity.Country on table Country 
INFO: Binding entity from annotated class: com.youfood.entity.User 
INFO: Bind entity com.youfood.entity.User on table User 
INFO: Binding entity from annotated class: com.youfood.entity.Order 
INFO: Bind entity com.youfood.entity.Order on table OrderTable 
INFO: Binding entity from annotated class: com.youfood.entity.Restaurant 
INFO: Bind entity com.youfood.entity.Restaurant on table Restaurant 
INFO: Mapping collection: com.youfood.entity.DinningRoom.zones -> Zone 
INFO: Mapping collection: com.youfood.entity.Zone.tables -> TTable 
INFO: Mapping collection: com.youfood.entity.Country.restaurants -> Restaurant 
INFO: Mapping collection: com.youfood.entity.Restaurant.dinningRoom -> DinningRoom 
INFO: Hibernate Validator not found: ignoring 
INFO: Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled. 
INFO: Initializing connection provider: org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider 
INFO: Using provided datasource 
INFO: RDBMS: MySQL, version: 5.1.54 
INFO: JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.13 (Revision: ${bzr.revision-id}) 
INFO: Using dialect: org.hibernate.dialect.MySQLDialect 
INFO: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4 
INFO: Transaction strategy: org.hibernate.ejb.transaction.JoinableCMTTransactionFactory 
INFO: instantiating TransactionManagerLookup: org.hibernate.transaction.SunONETransactionManagerLookup 
INFO: instantiated TransactionManagerLookup 
INFO: Automatic flush during beforeCompletion(): disabled 
INFO: Automatic session close at end of transaction: disabled 
INFO: JDBC batch size: 15 
INFO: JDBC batch updates for versioned data: disabled 
INFO: Scrollable result sets: enabled 
INFO: JDBC3 getGeneratedKeys(): enabled 
INFO: Connection release mode: auto 
INFO: Maximum outer join fetch depth: 2 
INFO: Default batch fetch size: 1 
INFO: Generate SQL with comments: disabled 
INFO: Order SQL updates by primary key: disabled 
INFO: Order SQL inserts for batching: disabled 
INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory 
INFO: Using ASTQueryTranslatorFactory 
INFO: Query language substitutions: {} 
INFO: JPA-QL strict compliance: enabled 
INFO: Second-level cache: enabled 
INFO: Query cache: disabled 
INFO: Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory 
INFO: Optimize cache for minimal puts: disabled 
INFO: Structured second-level cache entries: disabled 
INFO: Statistics: disabled 
INFO: Deleted entity synthetic identifier rollback: disabled 
INFO: Default entity-mode: pojo 
INFO: Named query checking : enabled 
INFO: Check Nullability in Core (should be disabled when Bean Validation is on): disabled 
INFO: building session factory 
INFO: Not binding factory to JNDI, no JNDI name configured 
INFO: JNDI InitialContext properties:{} 
INFO: EJB5181:Portable JNDI names for EJB JpaUserDao: [java:global/YouFood/JpaUserDao, java:global/YouFood/JpaUserDao!com.youfood.dao.UserDao] 
INFO: EJB5181:Portable JNDI names for EJB Authenticator: [java:global/YouFood/Authenticator!com.youfood.backoffice.utils.Authenticator, java:global/YouFood/Authenticator] 
INFO: WEB0671: Loading application [YouFood] at [/web] 
INFO: YouFood a été déployé en 1 279 ms. 

服務器日誌異常

GRAVE: EJB5070: Exception creating stateless session bean : [Authenticator] 
ATTENTION: EJB5184:A system exception occurred during an invocation on EJB Authenticator, method: public com.youfood.backoffice.utils.AuthenticationError com.youfood.backoffice.utils.Authenticator.connect(java.lang.String,java.lang.String) throws java.lang.Exception 
ATTENTION: javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB 
    at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:454) 
    at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2547) 
    at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1899) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212) 
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88) 
    at $Proxy150.connect(Unknown Source) 
    at com.youfood.backoffice.utils.__EJB31_Generated__Authenticator__Intf____Bean__.connect(Unknown Source) 
    at com.youfood.backoffice.servlet.LoginServlet.doPost(LoginServlet.java:61) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:688) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:770) 
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129) 
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) 
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) 
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 
    at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) 
    at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) 
    at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) 
    at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) 
    at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 
    at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 
    at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 
    at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) 
    at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) 
    at com.sun.grizzly.ContextTask.run(ContextTask.java:71) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 
    at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB 
    at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:726) 
    at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:247) 
    at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:449) 
    ... 39 more 
Caused by: javax.ejb.CreateException: Could not create stateless EJB 
    at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:534) 
    at com.sun.ejb.containers.StatelessSessionContainer.access$000(StatelessSessionContainer.java:95) 
    at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:724) 
    ... 41 more 
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception lors de la tentative d'injection de l'élément Remote ejb-ref name=com.youfood.backoffice.utils.Authenticator/userDao,Remote 3.x interface =com.youfood.dao.jpa.JpaUserDao,ejb-link=null,lookup=,mappedName=,jndi-name=com.youfood.dao.jpa.JpaUserDao,refType=Session dans class com.youfood.backoffice.utils.Authenticator : Lookup failed for 'java:comp/env/com.youfood.backoffice.utils.Authenticator/userDao' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:703) 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:470) 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:171) 
    at com.sun.ejb.containers.BaseContainer.injectEjbInstance(BaseContainer.java:1694) 
    at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:494) 
    ... 43 more 
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/com.youfood.backoffice.utils.Authenticator/userDao' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=com.youfood.backoffice.utils.Authenticator/userDao,Remote 3.x interface =com.youfood.dao.jpa.JpaUserDao,ejb-link=null,lookup=,mappedName=,jndi-name=com.youfood.dao.jpa.JpaUserDao,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao' [Root exception is javax.naming.NamingException: Lookup failed for 'com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao not found]]] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:599) 
    ... 47 more 
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=com.youfood.backoffice.utils.Authenticator/userDao,Remote 3.x interface =com.youfood.dao.jpa.JpaUserDao,ejb-link=null,lookup=,mappedName=,jndi-name=com.youfood.dao.jpa.JpaUserDao,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao' [Root exception is javax.naming.NamingException: Lookup failed for 'com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao not found]] 
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:191) 
    at com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1109) 
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:776) 
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:744) 
    at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:169) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:498) 
    ... 51 more 
Caused by: javax.naming.NamingException: Lookup failed for 'com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao' in SerialContext[myEnv={java.naming.factory.initial=com.sun.enterprise.naming.impl.SerialInitContextFactory, java.naming.factory.state=com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl, java.naming.factory.url.pkgs=com.sun.enterprise.naming} [Root exception is javax.naming.NameNotFoundException: com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao not found] 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:518) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:455) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at javax.naming.InitialContext.lookup(InitialContext.java:392) 
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:186) 
    ... 56 more 
Caused by: javax.naming.NameNotFoundException: com.youfood.dao.jpa.JpaUserDao#com.youfood.dao.jpa.JpaUserDao not found 
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:248) 
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:215) 
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:77) 
    at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:119) 
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:505) 
    ... 60 more 

回答

3

我的猜測是,你指定的名稱,映射的名字和你有什麼。這不是必需的。

像下面這樣的東西應該工作:

EJB:

@Stateless 
public class MyBean { 
    // ... 
} 

的Servlet:

@WebServlet(urlPatterns="/someurl") 
public class MyServlet extends HttpServlet { 

    @EJB 
    private MyBean myBean;  

    @Override 
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // ... 
    }   
} 

UPDATE

看到你的代碼後,這個問題是不是將EJB注入到Servlet中,但在Authenticator中注入JpaUserDao

您正在按課程注入,但由於JpaUserDao實現了一個業務接口UserDao,所以這不起作用。因爲它實現了這樣一個接口,所以不會創建任何本地視圖。其結果是,你必須使用界面注入:

@Stateless 
public class Authenticator { 

    private String userFullName; 
    private Long userId; 

    @EJB 
    private UserDao userDao; 

    // ... 
} 

作爲一個額外的音符,你的鑑定者bean的概念是行不通的。這是一個無狀態bean,它的實例變量對外界沒有任何意義。因此,getUserFullName()不保證返回您認爲會返回的結果。當容器碰巧選擇相同的bean實例時,它可能會在測試中暫時爲你工作,但這通常不起作用。

即使您堅持身份驗證器的引用,它仍然不起作用。問題是你得到一個代理,並且容器可能會將每個調用都指向另一個實例。可以將其視爲瀏覽器進行調用的Web場中的服務器的URL。您無法保證連續兩次會進入完全相同的物理服務器。

您嘗試在那裏執行的身份驗證應該由Web層中的bean處理,並將身份驗證詳細信息放入HTTP會話(此外,您應該也可以使用容器身份驗證,但這是一個完整的其他的東西太離題了)

+0

我的代碼看起來像寫了@Arjan Tijms,由於某種原因,我的第一個項目與EJB工作很好我使用了基本註釋,它運行良好,但在我的第二個項目中,我做了相同的實現,它不能按預期工作... – 2012-03-21 00:43:22

+0

查看我的更新回答 – 2012-03-21 20:19:46

+0

這就是工作謝謝你!好吧,我開始理解,在@ Stateless/@ Stateful註釋類中,我必須注入接口而不是實現,但沒有它們(如Servlet),我注入實現的接口(如JpaUserDao),是嗎? PS:爲了驗證你對我的測試是否正確,請完成這項工作,但是你是否有一些很好的做法/想法來教我認證? – 2012-03-22 03:14:10

1

有幾種注入EJB的方法。最常見和最簡單的解決方案將通過依賴注入如提到Arjan Tijms答案。

另一種方法是通過InitialContext.lookup()獲得參考。
在這種方法中,你可以選擇查找名稱傳遞:

  1. 使用類名的聲明豆接口

    String jindiName = BeanInterface.class.getName(); 
    InitialContext ctx = new InitialContext(); 
    BeanInterface bi = ctx.lookup(jndiName); 
    

    這也適用於遠程從任何獨立客戶端查找,因爲接口是public

  2. 使用金地名稱組件命名環境

    String jndiName = "java:comp/env/yourejb" 
    // same as shown above 
    

    這隻會相同的容器內工作,因爲「外面的世界」沒有進入到組件命名環境

爲了更好地理解的看看this JNDI名稱。

我希望這個hel,,玩得開心!

+0

這個工作,但我不明白爲什麼基本註釋不起作用 – 2012-03-21 00:49:30

+0

@GuillaumeMaka很難說,沒有看看你的代碼。也許你可以編輯你的問題併發布相關的部分。乾杯! – SimonSez 2012-03-21 08:19:52

0

如何從獨立的Java客戶端訪問遠程EJB組件?

第1步。在代碼中使用no-arg InitialContext()構造函數。 開發人員遇到的最常見問題是將特定的JNDI引導屬性傳遞給InitialContext(args)。其他一些供應商需要這一步,但GlassFish不需要。相反,使用no-arg InitialContext()構造函數。

第2步。將遠程EJB的全局JNDI名稱傳遞給InitialContext.lookup() 獨立Java客戶端無權訪問組件命名環境(java:comp/env)或@EJB註釋,所以他們必須顯式使用全局JNDI名稱來查找遠程EJB。(請參閱此處瞭解如何全局JNDI名稱分配給EJB組件的詳細信息)假設遠程EJB的全局JNDI名稱是「FooEJB」:

對於具有3.x的遠程業務接口豆類:

Foo foo =(Foo)new InitialContext()。lookup(「FooEJB」);

請注意,在EJB 3.x的情況下,查找的結果可以直接轉換爲遠程業務接口類型,而無需使用PortableRemoteObject.narrow()。

對於EJB 2.1和更早的會話/實體豆:

Object homeObj = new InitialContext().lookup("FooEJB"); 

FooHome fooHome =(FooHome) PortableRemoteObject.narrow(homeObj,FooHome.class);

Foo foo = fooHome.create(...) 第3步。在java客戶端的類路徑中包含相應的GlassFish .jars。 對於GlassFish 3. 在客戶端的類路徑中包含$ GLASSFISH_HOME/glassfish/lib/gf-client.jar。

例如,假設應用程序類是在/ home /用戶1/myclasses和主客戶端類是acme.MyClient:

的java -classpath $ GLASSFISH_HOME/GlassFish的/ lib目錄/ GF-client.jar中:/家/ user1/myclasses acme.MyClient

請注意,Java EE 6 API類由gf-client.jar自動包含,因此不需要將javaee.jar明確添加到類路徑中。 gf-client.jar引用GlassFish安裝目錄中的許多其他.jar,因此最好從安裝目錄本身中引用它,而不是將其複製(和所有其他.jar)到另一個位置。

注意:gf-client.jar位於GlassFish v3中的$ GLASSFISH_HOME/modules/gf-client.jar中。