2011-10-21 5 views
1

J'ai recherché ici, mais je n'ai pas trouvé de réponse.Utilisation de @Inject avec le type générique

Dans mon application, j'ai une classe principale abstraite pour mes contrôleurs, avec quelques méthodes et propriétés. Et je veux injecter le dao automatiquement.

abstract class AbstractController<E extends AbstractEntity, D extends AbstractDAO<E>> { 

    @Inject 
    private D dao; 

    // getters and setters 
} 

abstract class AbstractDAO<E extends AbstractEntity> { 
    @PersistentContext 
    private EntityManager em; 

    // finds returns E 
} 

// implemenation/usage 

class CarController extends AbstractController<Car, CarDAO> { 
} 

Obtenir l'exception:

org.jboss.weld.exceptions.DefinitionException: WELD-001407 Cannot declare an injection point with a type variable: [field] @Inject private AbstractController.dao 

utilisant: Glassfish 3.1 et JSF 2.1. Existe-t-il une solution de rechange, alternative, pour cela?

Merci.

+0

Est-ce que 'D' est un EJB (un bean géré)? –

+0

En utilisant des beans gérés EJB session (sans état ou avec état), je peux obtenir une instance en utilisant InitialContext.lookup dans la méthode get. Mais je veux utiliser une injection comme @Dependent. Tu as une meilleure idée pour moi? – rogeriolino

+0

Guice est capable de gérer ce genre de choses. – ysdx

Répondre

2

Il est techniquement très compliqué pour la réflexion de détecter le bon type d'exécution par une déclaration générique dans la source et la conversion. Weld ne le fait tout simplement pas et ne le supportera pas.

Mieux déclarer contre AbstractDAO<E>:

private AbstractDAO<E> dao; 

Vous ne gagnez rien à déclarer contre D de toute façon.

+0

Puis-je, via Weld, obtenir une instance en utilisant lookup/newInstance/... par nom de classe? – rogeriolino

Questions connexes