2017-02-23 5 views
1

Lors de l'utilisation de google guice, je suis tombé sur cette documentation sur la façon de graver manuellement des valeurs dans la portée de la requête.Pourquoi est-il nécessaire d'implémenter un fournisseur qui déclenche une exception lorsque vous créez manuellement une valeur?

[https://github.com/google/guice/wiki/ServletModule#dispatch-order]

Vous pouvez mettre en place un filtre personnalisé aux semences des valeurs à injecter plus tard par exemple

protected Filter createUserIdScopingFilter() { 
    return new Filter() { 
     @Override public void doFilter(
      ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 
     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     // ...you'd probably want more sanity checking here 
     Integer userId = Integer.valueOf(httpRequest.getParameter("user-id")); 
     httpRequest.setAttribute(
      Key.get(Integer.class, Names.named("user-id")).toString(), 
      userId); 
     chain.doFilter(request, response); 
     } 

     @Override public void init(FilterConfig filterConfig) throws ServletException { } 

     @Override public void destroy() { } 
    }; 
    } 

Dans cette documentation, ils expliquent la liaison comme

Et la liaison pourrait ressembler à ceci:

public class YourServletModule extends ServletModule { 
    @Override protected void configureServlets() { 
     ..... 
     filter("/process-user*").through(createUserIdScopingFilter()); 
    } 

    @Provides @Named("user-id") @RequestScoped Integer provideUserId() { 
     throw new IllegalStateException("user id must be manually seeded"); 
    } 
    } 

Je voudrais comprendre pourquoi il est nécessaire de mettre en œuvre une offre méthode lève une exception? Quel est son but ?

+0

J'utilise habituellement ce système pour qu'aucune classe abstraite ne soit utilisable mais jette une exception pour une méthode qui ne devrait pas être utilisée directement, mais qui remplace une sous-classe (seulement dans le projet existant, il y a des façons plus propres) – AxelH

Répondre

1

scopes dans Guice sont mises en œuvre en prenant un Provider et enveloppant dans une nouvelle Provider: https://google.github.io/guice/api-docs/4.1/javadoc/com/google/inject/Scope.html#scope-com.google.inject.Key-com.google.inject.Provider-

Il doit y avoir un fournisseur initial de conclure, même si celui-ci ne fait pas quelque chose d'utile.

En fait, si vous omettez le fournisseur du module, Guice trouvera des dépendances sur @Named("user-id") Integer, mais pas de fournisseur pour celui-ci, et ne parviendra même pas à créer l'injecteur. Il doit être en mesure de transmettre toutes les dépendances à un fournisseur à l'avance.