2017-02-23 27 views
1

在使用google guice時,我遇到了如何在請求範圍中手動生成值的文檔。爲什麼有必要實現在手動生成值時拋出異常的提供程序?

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

可以實現自定義過濾器的種子值,以在稍後例如注射

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() { } 
    }; 
    } 

在本文檔中,他們被解釋爲

的綁定和結合可能是這樣的:

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"); 
    } 
    } 

我想明白爲什麼有必要實施提供方法拋出異常?它的目的是什麼? https://google.github.io/guice/api-docs/4.1/javadoc/com/google/inject/Scope.html#scope-com.google.inject.Key-com.google.inject.Provider-

必須有一些初步的供應商來包裝,即使一個沒有做任何有用的:

+0

我通常使用這個系統對於沒有抽象類是可用的,但爲某些不應該直接使用的方法拋出異常,而是在子類中重寫(僅在現有項目中,有更清晰的方法) – AxelH

回答

1

作用域在吉斯被採取Provider,並在新Provider包裝它來實現。實際上,如果您從模塊中省略了提供者,Guice將在@Named("user-id") Integer上找到依賴關係,但沒有提供者,甚至無法創建注入器。它需要能夠提前將每個依賴關係連接到提供者。

相關問題