Внедрение ejb в управляемый компонент вызывает BeanInstantiationException

Я сделал простое приложение для проверки этой проблемы, с которой я столкнулся в небольшом масштабе. У меня есть 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!");
}
}

И у меня есть bean-компонент, управляющий jsf:

@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?


person Horacio González    schedule 10.07.2011    source источник


Ответы (1)


Вполне вероятно, что причиной проблемы является использование частного конструктора для сеансового компонента без сохранения состояния, о чем свидетельствует следующая запись об исключении:

org.jboss.ejb3.instantiator.spi.BeanInstantiationException: не удалось создать новый экземпляр без аргументов: class com.application.persistence.PersonaDAOImpl

Исключение типа BeanInstantiationException обычно возникает, когда контейнер не может создать экземпляр компонента. По всей вероятности, это связано с объявлением приватного конструктора и недоступностью любого другого неприватного конструктора без аргументов в сеансовом компоненте без сохранения состояния. Предполагается, что вам придется изменить видимость PersonaDAOImpl() на общедоступную.

Спецификация EJB 3.1 прямо заявляет об этом:

4.9.2 Класс сеансового компонента

  • Класс должен быть определен как общедоступный, не должен быть окончательным и не должен быть абстрактным. Класс должен быть классом высшего уровня.

  • У класса должен быть общедоступный конструктор, не принимающий параметров. Контейнер использует этот конструктор для создания экземпляров класса сеансового компонента. Ниже приведены требования к классу сеансового компонента:

person Vineet Reynolds    schedule 11.07.2011