将ejb注入托管bean会导致BeanInstantiationException

时间:2011-07-10 16:21:32

标签: java ejb cdi

我做了一个简单的应用来测试我在小规模的问题。我有一个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?

1 个答案:

答案 0 :(得分:3)

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

  

org.jboss.ejb3.instantiator.spi.BeanInstantiationException:无法创建不带参数的新实例:class com.application.persistence.PersonaDAOImpl

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

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

  

4.9.2会话Bean类

     
      
  • 该类必须定义为public,不得为final,且不得为abstract。该课程必须是顶级课程。

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

  •   
相关问题