异常创建无状态会话bean

时间:2014-03-06 01:35:05

标签: java servlets netbeans glassfish ejb

我正在尝试使用EJB在glassfish上创建一个JaveEE项目。 尝试运行时我有一个例外。

有一个实体bean:

User.java
@Entity
    public class User implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

EJB会话:

package com.supinfo.courses.EJB;

import com.supinfo.courses.EJB.local.UserFacadeLocal;
import com.supinfo.courses.entities.User;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;


@Stateless
public class UserFacade extends AbstractFacade<User> implements UserFacadeLocal {

    @PersistenceContext(unitName = "4JVA-Courses-ejbPU")
    private EntityManager em;

    public UserFacade(EntityManager em, Class<User> entityClass) {
        super(entityClass);
        this.em = em;
    }

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public UserFacade() {
        super(User.class);
    }

    @Override
    public User findByCredentials(String email, String password) {
        CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
        CriteriaQuery<User> cq = cb.createQuery(User.class);
        Root<User> from = cq.from(User.class);
        cq.where(cb.equal(from.get("email"), email));
        cq.where(cb.equal(from.get("password"), hashPassword(password)));
        TypedQuery<User> query = getEntityManager().createQuery(cq);
        List<User> resultList = query.getResultList();

        // return first user that match or null
        return (resultList.isEmpty()) ? null : resultList.get(0);
    }


    @Override
    public void create(User entity) {
        // encrypt password (sha1)
        entity.setPassword(hashPassword(entity.getPassword()));
        super.create(entity);
    }


    public String hashPassword(String password) {
        String sha1 = "";
        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(password.getBytes("UTF-8"));
            byte[] byteHash = crypt.digest();

            try (Formatter formatter = new Formatter()) {
                for (byte b : byteHash)
                    formatter.format("%02x", b);
                sha1 = formatter.toString();
            }
        } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
            throw new Error("Unable to hash password");
        }

        return sha1;
    }

}

使用它的服务:

@Stateless
public class UserService {

    @EJB
    public UserFacade userFacade;


    public User registerUser(User user) {
        userFacade.create(user);

        return user;
    }


    public User loginUser(String email, String password) {
        User foundUser = userFacade.findByCredentials(email, password);

        return foundUser;
    }


    public boolean isValidEmailAddress(String email) {
        boolean result = true;
        try {
            InternetAddress emailAddr = new InternetAddress(email);
            emailAddr.validate();
        } catch (AddressException ex) {
            result = false;
        }
        return result;
    }
}

最后是相关的servlet:

@WebServlet(name = "LoginServlet", urlPatterns = {"/login"})
public class LoginServlet extends AbstractServlet {

     @EJB
     UserService userService;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String error = null;
        // Parse login informations
        String email = request.getParameter("email");
        String password = request.getParameter("password");


        User user = null;
        if (email == null || password == null) {
            error = "Missing field";
        } else if(!userService.isValidEmailAddress(email)) {
            error = "Invalid email address";
        } else if(password.length() < 7) {
            error = "Password too short";
        } else {
            user = userService.loginUser(email, password);
            if (user == null) {
                error = "Bad Credentials";
            }
        }

        if (error != null) {
            //redirect with error data to jsp
            request.setAttribute("error", error);
            render("login", request, response);
        } else {
            request.getSession().setAttribute("user", user);
            forward("/courses/list", request, response);
        }

    }

}

堆栈跟踪表明:

    Avertissement:   Context path from ServletContext: /4JVA-Courses-war differs from path from bundle: 4JVA-Courses-war
Grave:   EJB5070: Exception creating stateless session bean : [UserService]
Avertissement:   EJB5184:A system exception occurred during an invocation on EJB UserService, method: public boolean com.supinfo.courses.services.UserService.isValidEmailAddress(java.lang.String)
Avertissement:   javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
    at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:435)
    at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2516)
    at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1906)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:210)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
    at com.sun.proxy.$Proxy447.isValidEmailAddress(Unknown Source)
    at com.supinfo.courses.services.__EJB31_Generated__UserService__Intf____Bean__.isValidEmailAddress(Unknown Source)
    at com.supinfo.courses.servlets.authentication.LoginServlet.doPost(LoginServlet.java:60)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
    ... 40 more
Caused by: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
    at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:700)
    at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:246)
    at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:430)
    ... 44 more
Caused by: javax.ejb.CreateException: Could not create stateless EJB
    at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:514)
    at com.sun.ejb.containers.StatelessSessionContainer.access$000(StatelessSessionContainer.java:97)
    at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:698)
    ... 46 more
Caused by: java.lang.IllegalStateException: Exception attempting to inject Remote ejb-ref name=com.supinfo.courses.services.UserService/userFacade,Remote 3.x interface =com.supinfo.courses.EJB.UserFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.supinfo.courses.EJB.UserFacade,refType=Session into class com.supinfo.courses.services.UserService: Lookup failed for 'java:comp/env/com.supinfo.courses.services.UserService/userFacade' 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 org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:145)
    at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:46)
    at org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64)
    at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:91)
    at org.glassfish.weld.services.JCDIServiceImpl.injectEJBInstance(JCDIServiceImpl.java:257)
    at com.sun.ejb.containers.BaseContainer.injectEjbInstance(BaseContainer.java:1683)
    at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:475)
    ... 48 more
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=com.supinfo.courses.services.UserService/userFacade,Remote 3.x interface =com.supinfo.courses.EJB.UserFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.supinfo.courses.EJB.UserFacade,refType=Session into class com.supinfo.courses.services.UserService: Lookup failed for 'java:comp/env/com.supinfo.courses.services.UserService/userFacade' 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:717)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:484)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:170)
    at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:138)
    ... 54 more
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/com.supinfo.courses.services.UserService/userFacade' 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.supinfo.courses.services.UserService/userFacade,Remote 3.x interface =com.supinfo.courses.EJB.UserFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.supinfo.courses.EJB.UserFacade,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' [Root exception is javax.naming.NamingException: Lookup failed for 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' 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.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade not found]]]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:613)
    ... 57 more
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=com.supinfo.courses.services.UserService/userFacade,Remote 3.x interface =com.supinfo.courses.EJB.UserFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.supinfo.courses.EJB.UserFacade,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' [Root exception is javax.naming.NamingException: Lookup failed for 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' 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.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade not found]]
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:188)
    at com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1143)
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:745)
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:715)
    at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:159)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:471)
    ... 61 more
Caused by: javax.naming.NamingException: Lookup failed for 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' 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.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade not found]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:183)
    ... 66 more
Caused by: javax.naming.NameNotFoundException: com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade not found
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:237)
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:204)
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:66)
    at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:114)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:478)
    ... 70 more

Avertissement:   StandardWrapperValve[LoginServlet]: Servlet.service() for servlet LoginServlet threw exception
javax.ejb.EJBException: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
    at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:435)
    at com.sun.ejb.containers.BaseContainer.getContext(BaseContainer.java:2516)
    at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1906)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:210)
    at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
    at com.sun.proxy.$Proxy447.isValidEmailAddress(Unknown Source)
    at com.supinfo.courses.services.__EJB31_Generated__UserService__Intf____Bean__.isValidEmailAddress(Unknown Source)
    at com.supinfo.courses.servlets.authentication.LoginServlet.doPost(LoginServlet.java:60)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
    at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
    at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    ... 42 more
Caused by: javax.ejb.EJBException: javax.ejb.CreateException: Could not create stateless EJB
    at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:700)
    at com.sun.ejb.containers.util.pool.NonBlockingPool.getObject(NonBlockingPool.java:246)
    at com.sun.ejb.containers.StatelessSessionContainer._getContext(StatelessSessionContainer.java:430)
    ... 44 more
Caused by: javax.ejb.CreateException: Could not create stateless EJB
    at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:514)
    at com.sun.ejb.containers.StatelessSessionContainer.access$000(StatelessSessionContainer.java:97)
    at com.sun.ejb.containers.StatelessSessionContainer$SessionContextFactory.create(StatelessSessionContainer.java:698)
    ... 46 more
Caused by: java.lang.IllegalStateException: Exception attempting to inject Remote ejb-ref name=com.supinfo.courses.services.UserService/userFacade,Remote 3.x interface =com.supinfo.courses.EJB.UserFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.supinfo.courses.EJB.UserFacade,refType=Session into class com.supinfo.courses.services.UserService: Lookup failed for 'java:comp/env/com.supinfo.courses.services.UserService/userFacade' 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 org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:145)
    at org.jboss.weld.injection.InjectionContextImpl.run(InjectionContextImpl.java:46)
    at org.jboss.weld.injection.producer.DefaultInjector.inject(DefaultInjector.java:64)
    at org.jboss.weld.injection.producer.BasicInjectionTarget.inject(BasicInjectionTarget.java:91)
    at org.glassfish.weld.services.JCDIServiceImpl.injectEJBInstance(JCDIServiceImpl.java:257)
    at com.sun.ejb.containers.BaseContainer.injectEjbInstance(BaseContainer.java:1683)
    at com.sun.ejb.containers.StatelessSessionContainer.createStatelessEJB(StatelessSessionContainer.java:475)
    ... 48 more
Caused by: com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=com.supinfo.courses.services.UserService/userFacade,Remote 3.x interface =com.supinfo.courses.EJB.UserFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.supinfo.courses.EJB.UserFacade,refType=Session into class com.supinfo.courses.services.UserService: Lookup failed for 'java:comp/env/com.supinfo.courses.services.UserService/userFacade' 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:717)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.inject(InjectionManagerImpl.java:484)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl.injectInstance(InjectionManagerImpl.java:170)
    at org.glassfish.weld.services.InjectionServicesImpl.aroundInject(InjectionServicesImpl.java:138)
    ... 54 more
Caused by: javax.naming.NamingException: Lookup failed for 'java:comp/env/com.supinfo.courses.services.UserService/userFacade' 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.supinfo.courses.services.UserService/userFacade,Remote 3.x interface =com.supinfo.courses.EJB.UserFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.supinfo.courses.EJB.UserFacade,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' [Root exception is javax.naming.NamingException: Lookup failed for 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' 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.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade not found]]]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at com.sun.enterprise.container.common.impl.util.InjectionManagerImpl._inject(InjectionManagerImpl.java:613)
    ... 57 more
Caused by: javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=com.supinfo.courses.services.UserService/userFacade,Remote 3.x interface =com.supinfo.courses.EJB.UserFacade,ejb-link=null,lookup=,mappedName=,jndi-name=com.supinfo.courses.EJB.UserFacade,refType=Session' .  Actual (possibly internal) Remote JNDI name used for lookup is 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' [Root exception is javax.naming.NamingException: Lookup failed for 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' 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.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade not found]]
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:188)
    at com.sun.enterprise.container.common.impl.ComponentEnvManagerImpl$EjbReferenceProxy.create(ComponentEnvManagerImpl.java:1143)
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:745)
    at com.sun.enterprise.naming.impl.GlassfishNamingManagerImpl.lookup(GlassfishNamingManagerImpl.java:715)
    at com.sun.enterprise.naming.impl.JavaURLContext.lookup(JavaURLContext.java:159)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:471)
    ... 61 more
Caused by: javax.naming.NamingException: Lookup failed for 'com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade' 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.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade not found]
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:491)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:438)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at com.sun.ejb.EjbNamingReferenceManagerImpl.resolveEjbReference(EjbNamingReferenceManagerImpl.java:183)
    ... 66 more
Caused by: javax.naming.NameNotFoundException: com.supinfo.courses.EJB.UserFacade#com.supinfo.courses.EJB.UserFacade not found
    at com.sun.enterprise.naming.impl.TransientContext.doLookup(TransientContext.java:237)
    at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:204)
    at com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:66)
    at com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:114)
    at com.sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:478)
    ... 70 more

1 个答案:

答案 0 :(得分:1)

问题解决了,我也完全不了解逻辑。

来自EJB Spec 3.1 - 4.9.2.1:

  

会话Bean超类

     

允许会话bean类具有自己的会话bean&gt;类的超类。但是,对于此案例,没有适用于注释处理或部署描述符的特殊规则。出于处理特定会话bean类的目的,无论超类本身是会话bean类,所有超类处理都是相同的。在这方面,将会话bean类用作超类仅仅代表了实现继承的方便用法,但没有组件继承语义。

     

例如,特定会话bean公开的客户端视图不会被也定义会话bean的子类继承。

@Stateless
public class A implements Foo { ... }

@Stateless
public class B extends A implements Bar { ... }
     

假设Foo和Bar是本地业务接口,并且没有关联的部署描述符,会话bean A公开本地业务接口Foo,会话bean B公开本地业务接口Bar,但不暴露Foo。

     

会话bean B需要在其应用的接口的公开视图集中显式包含Foo。例如:

@Stateless 
public class A implements Foo { ... }

@Stateless
public class B extends A implements Foo, Bar { ... }

我的情况,refractoring项目和删除接口工作。