Injeção de dependência através do construtor não funciona para EJB feijão

John :

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 parameterse 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? :)

Siliarus:

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 Classonde 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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=223891&siteId=1
Recomendado
Clasificación