Por que preciso de um construtor no-args para usar beans ApplicationScoped com injeção de Constructor no CDI?

Estou tentando aplicar o padrão de injeção de construtor aos beans no meu aplicativo CDI e encontro a seguinte mensagem de erro:

15:18:11,852 ERROR [izone.adams.webapp.error.IzoneExceptionHandler] (default task-40) org.jboss.weld.exceptions.UnproxyableResolutionException: WELD-001435: Normal scoped bean class webapp.util.LoginManagerAction is not proxyable because it has no no-args constructor - <unknown javax.enterprise.inject.spi.Bean instance>.
        at org.jboss.weld.bean.proxy.DefaultProxyInstantiator.validateNoargConstructor(DefaultProxyInstantiator.java:50)

De fato, para usar o padrão de injeção de construtor, projetei intencionalmente minha classe com um único construtor que requer argumentos:

@ApplicationScoped
@Typed(LoginManagerAction.class)
public class LoginManagerAction extends UtilBasicDispatchAction {

  @Inject
   public LoginManagerAction( SessionManager sessionManager, JMSHealthCheckService jmsHealthCheckService) {
       super();
       this.sessionManager = sessionManager;
       this.jmsHealthCheckService = jmsHealthCheckService;
   }

    ...
    ...

}

Olhando através doEspecificações CDI de tipos de feijão não-intransferíveis, Eu vejo isso:

3.15 Tipos de beans não-aprováveis

O contêiner usa proxies para fornecer determinadas funcionalidades. Certos tipos de bean legal não podem ser procurados pelo contêiner:

classes que não possuem um construtor não particular sem parâmetros,classes declaradas finais,classes que possuem métodos finais não estáticos com visibilidade pública, protegida ou padrão,tipos primitivos,e tipos de matriz.

Um tipo de bean deve ser proxy se um ponto de injeção resolver para um bean:

que requer um proxy de cliente ouque tenha um decorador associado ouque tem um interceptador ligado.

Caso contrário, o contêiner detecta automaticamente o problema e o trata como um problema de implantação.

E mais adiante na seçãoEscopos e pseudo-escopos normais declara:

Todos os escopos normais devem ser declarados explicitamente @NormalScope, para indicar ao contêiner que um proxy de cliente é necessário.

Dado@ApplicationScoped feijão são por definição@NormalScope, Preciso ter um construtor não-privado no-args. Então, eu preciso ter um construtor no-arg protegido apenas para satisfazer as especificações CDI? Eu tentei com um construtor no-args protegido, e parece funcionar, mas não entendo como o WELD está funcionando nesse caso; em quais condições ele usa o construtor no-args? Por que isso é um requisito no CDI?

O Weld usa apenas o no-arg para criar o proxy, mas ao chamar a implementação subjacente, ele usa o construtor baseado em injeção com argumentos?

questionAnswers(2)

yourAnswerToTheQuestion