2011-01-12 3 views
4

Je dois injecter un champ uniquement s'il est disponible dans la portée actuelle et null sinon. Par exemple:Injection Scoped facultative dans Guice

public class Thinger implements Provider<SomeSuch> { 
    public @Inject(optional=true) HttpServletRequest request;   

    public SomeSuch get() { 
     return request == null ? new WhosIt() : WhatsIt(); 
    } 
} 

Cependant, si HttpServletRequest est lié (ce qui est), mais pas dans la portée, je reçois un ProvisioningException. J'ai été en mesure de trouver une façon élégante de le faire, donc je suis relégué à faire quelque chose comme.

HttpServletRequest request = null; 
try { 
    request = injector.getInstance(HttpServletRequest.class); 
} catch(ProvisioningException e) {} 

Qui se sent juste toutes sortes d'erreurs. Y a-t-il un moyen approprié de faire cela?

Répondre

3

Qu'est-ce qui détermine exactement si votre classe est disponible? Le HttpServletRequest en quelque sorte contre-intuitif pour moi, puisque n'ayant pas une demande dans un service non-demande de portée ressemble à une erreur pour moi.

Une idée serait (en général) d'écrire un fournisseur personnalisé pour un titulaire avec juste une méthode get/set. Dans le fournisseur, vous pouvez exécuter les vérifications, que votre Chose soit disponible ou non dans la portée actuelle, elle renvoie toujours un Titulaire du type dont vous avez besoin, mais il peut être vide/nul selon la chose disponible. Puisque vous retournez toujours un support, l'injecteur devrait fonctionner correctement. Vous avez juste besoin de vérifier null dans le composant dans lequel vous injectez ceci.

Espérons que cela aide.

+0

Comment pouvons-nous vérifier si nous sommes "à l'intérieur" d'une portée? – BrunoJCM