Внедрение ejb в управляемый бин вызывает BeanInstantiationException - PullRequest
2 голосов
/ 10 июля 2011

Я сделал простое приложение, чтобы проверить эту проблему у меня в небольшом масштабе.У меня есть 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:

@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 Ответ

3 голосов
/ 11 июля 2011

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

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

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

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

4.9.2 Session BeanКласс

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

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

...