Comment puis-je faire une option obligatoire dans Guice?
Voici mon client:
class Client {
@Inject(optional=true) Service service;
}
Parfois que le Service n'est pas nécessaire, et nous savons que l'information lorsque la machine démarre (j'.e avant le liant est exécutée).
Comment puis-je faire la liaison facultative? Si je ne spécifiez pas contraignant du tout, il tente à nouveau le Service (et échoue car il n'y a pas de zéro argument du constructeur: "Erreur lors de l'injection au package.Client.service(Service de.java:40): impossible de trouver un constructeur dans le paquet.Service."), et je ne peux pas faire:
binder.bind(Service.class).toInstance(null);
parce que Guice semble rejeter les valeurs null. Des idées?
guice vous suggérons d'utiliser
Les gens à venir à travers cette question, peut-être intéressés à Guice du
binder.bind(Service.class).toProvider(Providers.<Service>of(null));
Les gens à venir à travers cette question, peut-être intéressés à Guice du
OptionalBinding
de la classe, qui vous permet de fournir une liaison qui peut ou peut ne pas être défini.OriginalL'auteur gubby | 2010-06-24
Vous devez vous connecter pour publier un commentaire.
Êtes-vous à l'aide de Guice 2.0? J'ai essayé cette fois avec
Service
être une interface (service de champ est toujoursnull
) et, avec elle, d'être une classe (null
si il ne peut pas créer une nouvelle instance avec un JIT de liaison, une instance si elle le peut). Les deux semblent comme ce que vous attendez.Dans les deux cas, ai-je utiliser une liaison comme
bind(Service.class).toInstance(null)
. Si vous le faites, alors vous devez vous assurer que tous les points d'injection pourService
préciser qu'ils permettent à l'êtrenull
. Cela peut être fait en annotant le point d'injection avec toute annotation appelé@Nullable
(vous pouvez faire votre propre ou en utiliser une existante):OriginalL'auteur ColinD
Si vous voulez faire de l'existence d'une liaison en option vous pouvez utiliser
@Inject(optional = true)
pour le champ et la méthode des injections. Pour le constructeur et autres type de paramètre injections, vous devez utiliser une classe d'assistance, par exemple:Noter que le ci-dessus ne permet pas
null
être injecté, afin Foo#bonjour ne reviendra jamaisnull
. Si vous ne souhaitez autorisernull
, il suffit d'ajouter le@Nullable
annotation. Gardez à l'esprit que le code suivant va pas, sauf si vous avez fourni une liaison (null, si rien d'autre) pour la Chaîne:OriginalL'auteur
Je n'arrivais pas à reproduire ce comportement. Lorsque j'exécute ce code d'exemple, l'injecteur crée et l'option d'injection est laissé sur ma faim. Le programme imprime
null
:Pourriez-vous reproduire ce dans un cas de test JUnit et de le soumettre à la Guice issue tracker?
OriginalL'auteur Jesse Wilson