2014-09-03 40 views
3

我有這樣的界面和簡單的實現:吉斯幾個工廠方法和空參數輔助注射

public interface Data {  
} 

import java.nio.file.Path; 
import javax.annotation.Nullable; 
import javax.inject.Inject; 
import com.google.inject.assistedinject.Assisted; 

public class SimpleData implements Data { 
    @Inject 
    public SimpleData(@Assisted @Nullable Path path) { 
    } 
} 

我要生成使用吉斯不同的方法Factory

import java.nio.file.Path; 

import javax.annotation.Nullable; 

public interface Factory { 
    Data create(); 
    Data load(@Nullable Path path); 
} 

但接下來的模塊配置:

import com.google.inject.Guice; 
import com.google.inject.Injector; 
import com.google.inject.assistedinject.FactoryModuleBuilder; 

public class Main { 
    public static void main(String[] args) { 
     Injector injector = Guice.createInjector(
       binder -> binder.install(
          new FactoryModuleBuilder().implement(Data.class, SimpleData.class) 
                 .build(Factory.class))); 
     Data data = injector.getInstance(Factory.class).create(); 
    } 
} 

失敗:

Exception in thread "main" com.google.inject.CreationException: Guice creation errors: 

    1) No implementation for java.nio.file.Path annotated with @com.google.inject.assistedinject.Assisted(value=) was bound. 
     while locating java.nio.file.Path annotated with @com.google.inject.assistedinject.Assisted(value=) 
     for parameter 0 at SimpleData.<init>(SimpleData.java:10) 
     at Factory.create(Factory.java:1) 
     at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:539) 
     at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335) 

    1 error 
     at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435) 
     at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:175) 
     at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109) 
     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 Main.main(Main.java:9) 

回答

7

我使用註釋@AssistedInject解決了我的問題。從的Javadoc引用:

當亦隨FactoryModuleBuilder使用,@AssistedInject註釋構造表示多個構造可以注射,每個具有不同的參數。

所以我添加了註釋和構造的SimpleData類:

public class SimpleData implements Data { 
    @AssistedInject 
    public SimpleData(@Assisted Path path) { 

    } 
    @AssistedInject 
    public SimpleData() { 

    } 
} 

我刪除了從工廠@Nullable註釋:

import java.nio.file.Path; 

public interface Factory { 
    Data create(); 
    Data load(Path path); 
} 
2

@Nullable並不意味着,如果你沒有綁定,那麼null將被注入。它只有允許寫入綁定null。如果您沒有綁定並且沒有適用的JIT綁定,則注入將失敗。

您的工廠的create()方法需要Guice找到一個@Assisted Path綁定,但顯然無法找到它,因爲您從未創建過一個,因此失敗。

老實說,我不確定是否有一個乾淨的方式來實現這種違約。理想情況下,您應該使用某些綁定註釋標記Path,併爲其添加默認綁定爲null,但@Assisted已經是綁定註釋,並且不可能在單個注入點上具有多個綁定註釋。您可以嘗試創建一個@Assisted Path結合:

binder.bind(Path.class).annotatedWith(Assisted.class).toInstance(null); 

但是,我不知道它是否會工作,因爲Assisted可特吉斯。即使它能起作用,它也不是很乾淨 - 與接受Path的其他輔助工廠可能會有衝突。

+0

感謝您的幫助。我使用'@ AssistedInject'找到了[解決方案](http://stackoverflow.com/a/25738517/1594933)。 – gontard 2014-09-09 07:04:42

0

我會讓Guice實現某種內部工廠接口,然後暴露其他的東西。像這樣:

interface InternalFactory { 
    Data load(@Nullable Path path); 
} 

public interface Factory { 
    Data load(); 
    Data load(@Nullable Path path); 
} 

class FactoryImpl implements Factory { 
    @Inject InternalFactory internalFactory; 

    @Override 
    public Data load() { 
     return load(null); // Pass your defaults here 
    } 

    @Override 
    public Data load(@Nullable Path path) { 
     // Sadly you'll have to explicitly forward arguments here, but it's not 
     // too bad IMO 
     return internalFactory.load(path); 
    } 
} 

public class MyModule extends AbstractModule { 
    @Override 
    protected void configure() { 
     install(new FactoryModuleBuilder() 
       .implement(Data.class, SimpleData.class) 
       .build(InternalFactory.class)); 

     bind(Factory).to(FactoryImpl.class); 
    } 
} 
+0

感謝您的幫助。我使用'@ AssistedInject'找到了[解決方案](http://stackoverflow.com/a/25738517/1594933)。 – gontard 2014-09-09 07:05:14