2011-05-31 125 views
1

我创建了一个无状态会话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(); 
    } 

} 

问:

  1. 是什么样的错误?如何 解决它?

    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 
  1. 当我创建的会话使用NetBeans 实体bean它 创建抽象门面为我们? 目的是什么?我知道门面 模式是作为接口到 路由请求?
  2. ejb-jar.xml有什么用?

所有设置都是默认设置。 ejb bean是在java ee 6 web应用程序中创建的,而不是在另一个war或jar中创建的。 Glassfish 3.1服务器。

请帮忙。

谢谢。

+0

精确实现,我希望有人能够帮助这个话题。 – peterwkc 2011-06-01 01:25:48

+0

通过注入接口而不是具体类来解决问题。 – peterwkc 2011-06-01 02:19:08

+0

为什么从ProductBean更改为@EJB private ProductFacadeLocalInterface productBean和它的工作原理? – peterwkc 2011-06-01 02:23:03

回答

5

您必须使用该接口。如果您使用Seam SolderCDI你可以指定

@Inject 
@Exact(ProductFacadeBean.class) 
+0

谢谢。让我试试看。 – peterwkc 2011-06-10 08:28:01

5

您需要通过引用它的接口来注入bean,而不是直接引用它的实现。像这样的东西..

@EJB 
private ProductFacadeLocalInterface productBean; 

然后,您可以访问使用您在ProductFacadeLocalInterface公开的接口方法的豆。

+0

为什么不直接注入实现而不是其接口?如果有两个班级,那么我需要我们需要用高级标记一个班级。 – peterwkc 2011-06-09 01:21:50

+0

当一个EJB(无状态bean)实现任何本地/远程接口时,它需要使用该接口进行访问。在JavaEE6和EJB3.1中,可以使用无接口bean并直接注入实现,但出于设计和可维护性原因应该避免。 – aseychell 2011-06-09 06:29:40

+0

@aseychell peterwkc的问题呢?如果你有两个实现接口的EJB,容器如何知道选择哪一个? – Unda 2014-07-04 09:28:26