使用带辅助参数的工厂创建实例会引发Google Guice异常

时间:2018-04-17 15:20:45

标签: java dependency-injection guice guice-3

我有两个实现的接口

public interface JobConfiguration {
    void execute();
}

DecryptJobConfiguration:

public class DecryptJobConfiguration implements JobConfiguration {
    @Inject
    public DecryptJobConfiguration(@Assisted("secretKey") String secretKey,
                                   @Assisted("inputImagePath") String inputImagePath,
                                   ImageDecrypter imageDecrypter) {
        // Do stuff
    }

    @Override
    public void execute(){
        // DO stuff
    }
}

EncryptJobConfiguration:

public class EncryptJobConfiguration implements JobConfiguration {
    @Inject
    public EncryptJobConfiguration(@Assisted("inputString") String inputString,
                                   @Assisted("secretKey") String secretKey,
                                   @Assisted("inputImagePath") String inputImagePath,
                                   ImageEncrypter imageEncrypter,
        // Do stuff
    }

    @Override
    public void execute() {
        // Do stuff
    }
}

我有一个工厂界面:

public interface JobConfigurationFactory {
    @Named("encrypt")
    JobConfiguration createEncrypt(@Assisted("inputString") String inputString,
                                   @Assisted("secretKey") String secretKey,
                                   @Assisted("inputImagePath") String inputImagePath);

    @Named("decrypt")
    JobConfiguration createDecrypt(@Assisted("secretKey") String secretKey,
                                   @Assisted("inputImagePath") String inputImagePath);
}

Google Guice中安装了哪个:

install(new FactoryModuleBuilder()
        .implement(JobConfiguration.class, Names.named("encrypt"), EncryptJobConfiguration.class)
        .implement(JobConfiguration.class, Names.named("decrypt"), DecryptJobConfiguration.class)
        .build(JobConfigurationFactory.class));

在另一个我希望创建EncryptJobConfiguration实例的课程中,我注入了JobConfigurationFactory

@Inject
public CommandLineArgumentValidator(JobConfigurationFactory jobConfigurationFactory){
    this.jobConfigurationFactory = jobConfigurationFactory;
}

以及稍后我称之为createEncrypt的其中一种方法:

jobConfigurationFactory.createEncrypt("A", "B", "C");

我希望这会给我一个EncryptJobConfiguration的实例,但会导致此例外:

  

java.lang.NoSuchMethodError:   com.google.common.base.Preconditions.checkState(ZLjava /郎/字符串; Ljava /郎/对象;)V

     

在   com.google.inject.assistedinject.FactoryProvider2.invoke(FactoryProvider2.java:824)     在com.sun.proxy。$ Proxy12.createEncrypt(未知来源)at   com.infojolt.imageencrypt.CommandLineArgumentValidator.validateArguments(CommandLineArgumentValidator.java:29)     在   com.infojolt.imageencrypt.CommandLineArgumentValidatorTest.validateArgumentsReturnsInputStringWhenAllRequiredFieldsAreSet(CommandLineArgumentValidatorTest.java:55)     在   java.base / jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(母语   方法)

这是我第一次使用Google Guice,我不确定我是否误解了它应该如何运作?我应该如何创建EncryptJobConfiguration的新实例?

1 个答案:

答案 0 :(得分:0)

事实证明我错过了这个问题的重要信息。我使用的是Google Guice 4.0。升级到v4.2解决了问题,而没有任何其他代码更改。