【问题标题】:Injecting ejb into managed bean causes BeanInstantiationException将 ejb 注入托管 bean 会导致 BeanInstantiationException
【发布时间】:2011-07-10 16:21:31
【问题描述】:

我制作了一个简单的应用程序来小规模地测试我遇到的这个问题。我有一个 ejb:

@Local
public interface PersonaDAO {
public void sayHello(Persona persona);
}


@Stateless
public class PersonaDAOImpl implements PersonaDAO {
    private PersonaDAOImpl() {
    }

    public void sayHello(String nombre) {
    System.out.println("HELLO " + nombre + " welcome to EJB 3!");
}
}

我得到了一个管理 jsf 的 bean:

@ManagedBean(name="loginBean" )
@ViewScoped
public class LoginBean extends PageBean {
    private String nombre;
@EJB
private PersonaDAO dao; 

public String confirmar()
{
    String outcome = null;
    Persona persona = new Persona();
    persona.setNombre(nombre);
    dao.sayHello(persona);
    return outcome;
}
.....
}

我收到此部署错误:

DEPLOYMENTS IN ERROR:
  Deployment "vfs:///home/shapacko/ambiente/jboss-6.0.0.Final/server/default/deploy/Prueba.war" is in error due to the following reason(s): java.lang.RuntimeException: Could not resolve @EJB reference: [EJB Reference: beanInterface 'com.application.business.ServicioPersonasImpl', beanName 'null', mappedName 'null', lookupName 'null', owning unit 'AbstractVFSDeploymentContext@8203928{vfs:///home/shapacko/ambiente/jboss-6.0.0.Final/server/default/deploy/Prueba.war}'] for environment entry: env/com.application.presentation.seguridad.LoginBean/sp in unit AbstractVFSDeploymentContext@8203928{vfs:///home/shapacko/ambiente/jboss-6.0.0.Final/server/default/deploy/Prueba.war}

然后,如果我运行应用程序,我会得到:

javax.servlet.ServletException: javax.ejb.EJBException: java.lang.RuntimeException: org.jboss.ejb3.instantiator.spi.BeanInstantiationException: Could not create new instance with no arguments of: class com.application.persistence.PersonaDAOImpl
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:325)

我不明白有什么问题。这种注射可以吗?还是我需要做一个 jndi 查找而不是注入 ejb?

【问题讨论】:

    标签: java ejb cdi


    【解决方案1】:

    对于无状态会话 Bean 的私有构造函数的使用很可能是问题的原因,如以下异常条目所示:

    org.jboss.ejb3.instantiator.spi.BeanInstantiationException:无法创建没有参数的新实例:类 com.application.persistence.PersonaDAOImpl

    当容器无法创建 bean 的实例时,通常会抛出 BeanInstantiationException 类型的异常。这很可能是由于声明了私有构造函数,并且无状态会话 Bean 中没有任何其他非私有无参数构造函数。推断您将不得不将PersonaDAOImpl() 的可见性更改为公开。

    EJB 3.1 规范非常明确地说明了这一点:

    4.9.2 会话 Bean 类

    • 类必须定义为公共的,不能是最终的,也不能是抽象的。该类必须是顶级类。

    • 类必须有一个不带参数的公共构造函数。容器使用这个构造函数来创建会话 bean 类的实例。 以下是会话 bean 类的要求:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-27
      • 2013-07-28
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多