Guice 辅助:未绑定使用 @com.google.inject.assistedinject.Assisted(value=prefix) 注释的 java.lang.String 的实现

Guice Assisted : No implementation for java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=prefix) was bound

我已经这样做了一百万次了,但现在它不起作用,我不知道为什么!

我的界面定义了 Writers 的合同,例如:

public interface Writer {
    
    void exit() throws IOException;

    void write(String row) throws IOException;
}

具体实现:

import com.google.inject.assistedinject.Assisted;
import javax.inject.Inject;


public class TextFileWriter implements Writer {

    //...
    @Inject
    public TextFileWriter(@Assisted("store") String store, @Assisted("prefix") String prefix, @Assisted Line line, @Assisted LocalDate date) throws IOException {
    //...
    }

    //...
}

现厂:

public interface WriterFactory {
    
    Writer textWriter(String store, String prefix, Line line, LocalDate date) throws IOException;
}

最后是我的配置:

@Override
protected void configure() {
    install(new FactoryModuleBuilder()
            .implement(Writer.class, TextFileWriter.class)
            .build(WriterFactory.class)
    );
}

所有这些在启动时都会抛出一个异常:

  1. No implementation for java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=prefix) was bound.
    while locating java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=prefix) for the 2nd parameter of daemons.filerecorder.TextFileWriter.(TextFileWriter.java:38)
    at daemons.filerecorder.WriterFactory.textWriter(WriterFactory.java:1) at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:666) at com.google.inject.assistedinject.FactoryModuleBuilder.configure(FactoryModuleBuilder.java:335) (via modules: com.google.inject.util.Modules$OverrideModule -> modules.GuiceConfig -> com.google.inject.assistedinject.FactoryModuleBuilder)

  2. No implementation for java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=store) was bound.
    while locating java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=store) for the 1st parameter of daemons.filerecorder.TextFileWriter.(TextFileWriter.java:38)
    at daemons.filerecorder.WriterFactory.textWriter(WriterFactory.java:1) at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:666) at com.google.inject.assistedinject.FactoryModuleBuilder.configure(FactoryModuleBuilder.java:335) (via modules: com.google.inject.util.Modules$OverrideModule -> modules.GuiceConfig -> com.google.inject.assistedinject.FactoryModuleBuilder)

  3. A binding to java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was already configured at daemons.filerecorder.WriterFactory.textWriter(). at daemons.filerecorder.WriterFactory.textWriter(WriterFactory.java:1)
    at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:666) at com.google.inject.assistedinject.FactoryModuleBuilder.configure(FactoryModuleBuilder.java:335) (via modules: com.google.inject.util.Modules$OverrideModule -> modules.GuiceConfig -> com.google.inject.assistedinject.FactoryModuleBuilder)

有什么想法可以完成这项工作吗?

提前致谢。

@Assisted 添加到接口的不明确 String 类型参数中

您缺少工厂方法的 @Assisted 参数。所以调整如下:

public interface WriterFactory {
  Writer textWriter(@Assisted("store") String store, @Assisted("prefix") String prefix, Line line, LocalDate date) throws IOException;
}

这在FactoryModuleBuilder javadoc, section "Making parameter types distinct"中有解释。这是强制性的,因为您有两个相同类型的参数,String.