1

これが私が遭遇した問題です:

Class SimpleCommand implements Executable{
private final ConfigManager config;
private String name;

@Inject    
public SimpleCommand(ConfigManager config, @Assisted String name){
  this.config = config;
  this.name = name;
  }
}

Class MyModule extends AbstractModule{
@Override
protected void configure() {
     bind(CommandFactory.class).toProvider(FactoryProvider.newFactory(CommandFactory.class, SimpleCommand.class));
     bind(Executable.class).to(SimpleCommand.class);
     }
}

以下を使用してSimpleCommandのインスタンスを取得しようとすると、

Guice.createInjector(new MyModule()).getInstance(CommandFactory.class).create("sample command");

このエラーが発生しました:

1) No implementation for java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was bound.
  while locating java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=)
    for parameter 2 at model.Command.<init>(SimpleCommand.java:58)
  at module.MyModule.configure(MyModule.java:34)

だから私の問題は、SimpleCommandがAssisted Injectedパラメーターを持っているときにSimpleCommandをExecutableにバインドするにはどうすればよいですか?

CommandFactoryとその実装は次のとおりです。

public interface CommandFactory{
  public Command create(String name);
}


public class GuiceCommandFactory implements CommandFactory{
  private Provider<ConfigManager> configManager ;

  @Inject
  public GuiceCommandFactory(Provider<ConfigManager> configManager){
    this.configManager = configManager;
  }

  public Command create(String cmd){
    return new Command(configManager.get(), cmd);
  }
}
4

1 に答える 1

0

2つの問題があるようです。

1つはとありbind(Executable.class).to(SimpleCommand.class)ます。へのバインディングは、 への依存関係を持つクラスに を直接注入できることExecutableSimpleCommand意味します。しかし、Guice はそれ自体のインスタンスを作成できないため (ファクトリに提供される補助パラメーターが必要です)、バインドは無効です。エラー メッセージは通常のバインディング アノテーションとして扱われ、コンストラクターでバインドを解決しようとしていますが、バインドされていません。SimpleCommandExecutableSimpleCommand@AssistedString

さらに、Assisted Inject を使用して s のファクトリを作成している場合、バインディング アノテーションを使用せずExecutableに別のバインディングを作成することはできないようです。支援された注入を使用しているので、おそらくファクトリを使用して複数のインスタンスを作成したいので、直接バインドしたい個人はおそらくシステムで特定の意味を持っているでしょう?ExecutableExecutable

その場合、次のようなバインディング アノテーション@Defaultとプロバイダー メソッドを使用する必要があります。

@Provides
@Default
protected Executable provideDefaultExecutable(ConfigManager configManager) {
   return new SimpleCommand(configManager, "My default command");
}
于 2009-10-22T20:18:03.317 に答える