Meu aplicativo está sendo implantado no IBM WebSphere. Eu tenho um serviço simples e eu gostaria de saber como injeção de dependência funciona neste caso.
// stateless EJB
@Stateless
public class UserService {
private UserDAO userDAO;
// btw, UserDAO is stateless EJB as well
@Inject
public UserService(UserDAO userDAO) {
this.userDAO = userDAO;
}
// biz methods ...
}
Ele falha com o seguinte erro:
[ERROR] CWWKZ0002E: Ocorreu uma exceção ao iniciar o aplicativo meu aplicativo. A mensagem de exceção foi: com.ibm.ws.container.service.state.StateChangeException: com.ibm.ws.cdi.CDIException: com.ibm.wsspi.injectionengine.InjectionException: com.ibm.ejs.container.EJBConfigurationException: EJB classe com.demo.app.UserService deve ter um construtor público que leva sem parâmetros
Lembro-me de que havia algo na especificação EJB que diz: the class must have a public constructor that takes no parameters
e faz sentido para mim que a instância de bean é primeiro instanciado pelo contêiner e depois injeção de dependência é feito .
Por outro lado, eu encontrei isso no docs SOLDA:
Primeiro, o contêiner chama o construtor de feijão (o construtor padrão ou aquele anotado @Inject), para obter uma instância do bean.
E eu estou confuso um pouco, porque meu EJB não pode ser instanciado.
Como é a instância EJB sendo criado e dependências injetadas quando temos ponto de injeção construtor?
Alguma ideia? :)
Então, o que acontece é que você não cumprir os requisitos para inicializar feijão EJB.
CDI especificação tem algumas limitações de construtores - tanto no-args ou um com @Inject
. Mas há também neste capítulo , que especifica que, em EE, o conjunto de regras é estendido por aquilo sessão EJB feijão exigem.
E agora estamos entrando especificação EJB que requer um construtor não-arg em um bean. Esta deve ser no capítulo Enterprise Bean Class
onde se afirma
A classe deve definir um construtor público que leva sem argumentos.
Agora, finalmente, avançar para se isso deve funcionar - por exemplo, você pode ter um bean EJB usando injeção de construtor CDI? Bem, vamos dar uma olhada em CDI TCK, um conjunto de testes que todos implementação e recipientes têm que passar, a fim de ser capaz de reivindicar eles implementam CDI. Lá, podemos ver este feijão e este teste de usá-lo - por isso sim, este trabalho pode, mas você precisa ter os dois construtores.