我创建了一个无状态会话bean是这样的:EJB 3.1依赖注入失败
@WebServlet(name = "ProductController", urlPatterns = {"/ProductController"})
public class ProductController extends HttpServlet {
@EJB
private ProductFacadeBean productBean;
}
@Stateless
public class ProductFacadeBean extends AbstractFacade<Product> implements ProductFacadeLocalInterface {
@PersistenceContext(unitName = "OnlineStorePU")
private EntityManager em;
protected EntityManager getEntityManager() {
return em;
}
public ProductFacadeBean() {
super(Product.class);
}
}
@Local
public interface ProductFacadeLocalInterface {
void create(Product product);
void edit(Product product);
void remove(Product product);
Product find(Object id);
List<Product> findAll();
List<Product> findRange(int[] range);
int count();
}
public abstract class AbstractFacade<T> {
private Class<T> entityClass;
public AbstractFacade(Class<T> entityClass) {
this.entityClass = entityClass;
}
protected abstract EntityManager getEntityManager();
public void create(T entity) {
getEntityManager().persist(entity);
}
public void edit(T entity) {
getEntityManager().merge(entity);
}
public void remove(T entity) {
getEntityManager().remove(getEntityManager().merge(entity));
}
public T find(Object id) {
return getEntityManager().find(entityClass, id);
}
public List<T> findAll() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
return getEntityManager().createQuery(cq).getResultList();
}
public List<T> findRange(int[] range) {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
cq.select(cq.from(entityClass));
javax.persistence.Query q = getEntityManager().createQuery(cq);
q.setMaxResults(range[1] - range[0]);
q.setFirstResult(range[0]);
return q.getResultList();
}
public int count() {
javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
cq.select(getEntityManager().getCriteriaBuilder().count(rt));
javax.persistence.Query q = getEntityManager().createQuery(cq);
return ((Long) q.getSingleResult()).intValue();
}
}
问:
是什么样的错误?如何 解决它?
javax.naming.NamingException中:查找 失败 '的java:comp/env的/ Controller.ProductController /的ProductBean' 在 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。命名} [根异常是 javax.naming.NamingException: 异常解决Ejb'远程 ejb-ref name = Controller.Pro ductController/productBean,Remote 3.x interface = EJB.ProductFacadeBean,ejb-link = null,lookup =,mappedName =,jndi-name = EJB.ProductFacadeBean,refType = Session' 。实际(可能是内部)远程用于查找 JNDI名称是 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' [根异常是 javax.naming.NamingException中:查找 失败 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' 在 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} [根异常是 javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean 未找到]]]
完整的例外在这里附:
HTTP Status 500 -
type Exception report
message
descriptionThe server encountered an internal error() that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: PWC1392: Error instantiating servlet class Controller.ProductController
root cause
com.sun.enterprise.container.common.spi.util.InjectionException: Error creating managed object for class Controller.ProductController
root cause
com.sun.enterprise.container.common.spi.util.InjectionException: Exception attempting to inject Remote ejb-ref name=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session into class Controller.ProductController
root cause
javax.naming.NamingException: Lookup failed for 'java:comp/env/Controller.ProductController/productBean' 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=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' [Root exception is javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' 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: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]]]
root cause
javax.naming.NamingException: Exception resolving Ejb for 'Remote ejb-ref name=Controller.ProductController/productBean,Remote
3.x interface =EJB.ProductFacadeBean,ejb-link=null,lookup=,mappedName=,jndi-name=EJB.ProductFacadeBean,refType=Session' . Actual (possibly internal) Remote JNDI name used for lookup is 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' [Root exception is javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' 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: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]]
root cause
javax.naming.NamingException: Lookup failed for 'EJB.ProductFacadeBean#EJB.ProductFacadeBean' 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: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found]
root cause
javax.naming.NameNotFoundException: EJB.ProductFacadeBean#EJB.ProductFacadeBean not found
note The full stack traces of the exception and its root causes are available in the GlassFish Server Open Source Edition 3.1 logs. GlassFish Server Open Source Edition 3.1
- 当我创建的会话使用NetBeans 实体bean它 创建抽象门面为我们? 目的是什么?我知道门面 模式是作为接口到 路由请求?
- ejb-jar.xml有什么用?
所有设置都是默认设置。 ejb bean是在java ee 6 web应用程序中创建的,而不是在另一个war或jar中创建的。 Glassfish 3.1服务器。
请帮忙。
谢谢。
精确实现,我希望有人能够帮助这个话题。 – peterwkc 2011-06-01 01:25:48
通过注入接口而不是具体类来解决问题。 – peterwkc 2011-06-01 02:19:08
为什么从ProductBean更改为@EJB private ProductFacadeLocalInterface productBean和它的工作原理? – peterwkc 2011-06-01 02:23:03