2013-12-07 50 views
1

我有以下模塊,具有requireBinding:吉斯requireBinding到TypeLiteral拋出錯誤

public class BillingModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     bind(WalletBilling.class).to(WalletBillingService.class); 
     requireBinding(Key.get(new TypeLiteral<Map<String, String>>() {}, ResourceUrls.class)); 
    } 



    @Provides 
    String returnUrls(@ResourceUrls Map<String, String> resourceUrls){ 
     return resourceUrls.get("hello"); 
    } 

} 

我注意到,當我運行實例化的模塊,我得到下面的錯誤代碼:

異常的線程「主要」 com.google.inject.CreationException:吉斯創建錯誤:

1) No implementation for java.util.Map<java.lang.String, java.lang.String> annotated with interface com.example.helloworld.annotations.ResourceUrls was bound. 
    at com.example.helloworld.modules.BillingModule.configure(BillingModule.java:32) 

1 error 
    at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435) 
    at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154) 
    at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106) 
    at com.google.inject.Guice.createInjector(Guice.java:95) 
    at com.google.inject.Guice.createInjector(Guice.java:72) 
    at com.google.inject.Guice.createInjector(Guice.java:62) 
    at com.example.helloworld.Main.main(Main.java:52) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

我想用@ResourceUrls註解@Provides方法PARAM我有滿意的結合,但事實並非如此,我是Guice的小菜鳥,所以會欣賞一些指針。

回答

0

您需要以某種方式提供地圖,否則guice不知道從哪裏得到它。像這樣的東西應該工作。

@Provides 
@ResourceUrls Map<String, String> getResourceUrls() { 
    ... 
    return map; 
} 
+0

這將導致「@ResourceUrls不適用方法:」我相信BindingAnnotations只能應用於PARAMS沒有方法.. – jwesonga

+1

@jwesonga,不,這取決於你的'@ ResourceUrls'定義。這是你的註釋,不是嗎?檢查'@interface ResourceUrls'定義中的'@ Target'註釋。它必須包含'METHOD'才能應用於方法。順便說一句,塔維安是絕對正確的。如果你沒有在任何地方定義它,Guice應該知道注入哪張地圖? –

+0

我改變了我的註解的目標,一切都在運行..我想我的問題是我從一個現有的代碼庫看這段代碼,它似乎沒有提供者運行得很好,所以我不知道在原來的位置代碼地圖正在提供.. – jwesonga