1

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

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

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. 没有绑定带有 @com.google.inject.assistedinject.Assisted(value=prefix) 注释的 java.lang.String 的实现。 在daemons.filerecorder.WriterFactory.textWriter
    中为 daemons.filerecorder.TextFileWriter.(TextFileWriter.java:38) 的第二个参数定位带有 @com.google.inject.assistedinject.Assisted(value=prefix) 注释的 java.lang.String
    (WriterFactory.java:1) at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:666) at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335)(通过模块: com.google.inject.util.Modules$OverrideModule -> modules.GuiceConfig -> com.google.inject.assistedinject.FactoryModuleBuilder$1)

  2. 没有绑定带有 @com.google.inject.assistedinject.Assisted(value=store) 注释的 java.lang.String 的实现。 同时在 daemons.filerecorder.WriterFactory.textWriter
    中为 daemons.filerecorder.TextFileWriter.(TextFileWriter.java:38) 的第一个参数定位带有 @com.google.inject.assistedinject.Assisted(value=store) 注释的 java.lang.String
    (WriterFactory.java:1) at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:666) at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335)(通过模块: com.google.inject.util.Modules$OverrideModule -> modules.GuiceConfig -> com.google.inject.assistedinject.FactoryModuleBuilder$1)

  3. 已在 daemons.filerecorder.WriterFactory.textWriter() 中配置了与带有 @com.google.inject.assistedinject.Assisted(value=) 注释的 java.lang.String 的绑定。在 daemons.filerecorder.WriterFactory.textWriter(WriterFactory.java:1)
    在 com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:666) 在 com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder. java:335)(通过模块:com.google.inject.util.Modules$OverrideModule -> modules.GuiceConfig -> com.google.inject.assistedinject.FactoryModuleBuilder$1)

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

提前致谢。

4

1 回答 1

2

添加@Assisted到接口的模棱两可的String类型参数

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

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

这在FactoryModuleBuilderjavadoc 的“使参数类型不同”部分中进行了解释。这是强制性的,因为您有两个具有相同类型的参数,String.

于 2020-06-23T21:41:04.007 回答