gpt4 book ai didi

java - 异常创建无状态 session bean

转载 作者:行者123 更新时间:2023-11-30 11:21:26 26 4
gpt4 key购买 nike

我正在尝试在 glassfish 上使用 EJB 创建一个 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 session :

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

最佳答案

问题解决了,我也没有完全理解逻辑。

来自 EJB 规范 3.1 - 4.9.2.1:

Session Bean Superclasses

A session bean class is permitted to have superclasses that are themselves session bean >classes. However, there are no special rules that apply to the processing of annotations or the deployment descriptor for this case. For the purposes of processing a particular session bean class, all superclass processing is identical regardless of whether the superclasses are themselves session bean classes. In this regard, the use of session bean classes as superclasses merely represents a convenient use of implementation inheritance, but does not have component inheritance semantics.

For example, the client views exposed by a particular session bean are not inherited by a subclass that also happens to define a session bean.

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

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

Assuming Foo and Bar are local business interfaces and there is no associated deployment descriptor, session bean A exposes local business interface Foo and session bean B exposes local business interface Bar, but not Foo.

Session bean B would need to explicitly include Foo in its set of exposed views for that interface to apply. For example:

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

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

我的情况是,重构项目和删除接口(interface)有效。

关于java - 异常创建无状态 session bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22213108/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com