Guice协助注入了几个工厂方法和null参数

gon*_*ard 4 java dependency-injection guice

我有这个界面和简单的实现:

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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我想Factory用guice 生成一个不同的方法.

import java.nio.file.Path;

import javax.annotation.Nullable;

public interface Factory {
    Data create();
    Data load(@Nullable Path path);
}
Run Code Online (Sandbox Code Playgroud)

但是以下模块配置:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

失败:

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)
Run Code Online (Sandbox Code Playgroud)

gon*_*ard 9

我使用注释解决了我的问题@AssistedInject.从javadoc引用:

与串联使用时FactoryModuleBuilder,使用@AssistedInject注释的构造函数表示可以注入多个构造函数,每个构造函数具有不同的参数.

所以我将注释和构造函数添加到SimpleData类中:

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

    }
    @AssistedInject
    public SimpleData() {

    }
}
Run Code Online (Sandbox Code Playgroud)

我从工厂删除了@Nullable注释:

import java.nio.file.Path;

public interface Factory {
    Data create();
    Data load(Path path);
}
Run Code Online (Sandbox Code Playgroud)