将构造函数参数传递到Google Guice

时间:2018-04-19 13:12:44

标签: java guice

我正在尝试将构造函数参数从一个类传递到另一个类的工厂中:

public class PerPixelImageUpdater implements ImageUpdater {
    private final PixelUpdater pixelUpdater;
    private final BufferedImage image;

    @Inject
    PerPixelImageUpdater(PixelUpdaterFactory pixelUpdaterFactory,
                         @Assisted BufferedImage image){
        this.image = image;
        this.pixelUpdater = pixelUpdaterFactory.create(image);
    }

    //Methods
}

厂:

public interface ImageUpdaterFactory {
    ImageUpdater create(BufferedImage image);
}

在Guice注册:

install(new FactoryModuleBuilder()
                .implement(ImageUpdater.class, PerPixelImageUpdater.class)
                .build(ImageUpdaterFactory.class));

当我运行此代码时,我收到一个错误,实现没有绑定?

  

1)没有用java注释的java.awt.image.BufferedImage的实现   @ com.google.inject.assistedinject.Assisted(value ="")已绑定。
  同时查找带有注释的java.awt.image.BufferedImage   @ com.google.inject.assistedinject.Assisted(值="&#34)       对于com.infojolt.imageencrypt.PerPixelImageUpdater的第二个参数。(PerPixelImageUpdater.java:16)

我错过了什么?我是否需要以不同的方式注册工厂?

额外细节:

实际上有两个错误

  

1)没有用java注释的java.awt.image.BufferedImage的实现   @ com.google.inject.assistedinject.Assisted(value ="")已绑定。
  同时查找带有注释的java.awt.image.BufferedImage   @ com.google.inject.assistedinject.Assisted(值="&#34)       对于com.infojolt.imageencrypt.PerPixelImageUpdater的第二个参数。(PerPixelImageUpdater.java:16)   在   com.infojolt.imageencrypt.Injection.ImageEncryptModule.configure(ImageEncryptModule.java:25)

     

2)没有使用注释的java.awt.image.BufferedImage实现   @ com.google.inject.assistedinject.Assisted(value ="")已绑定。
  同时查找带有注释的java.awt.image.BufferedImage   @ com.google.inject.assistedinject.Assisted(值="&#34)       对于com.infojolt.imageencrypt.SimplePixelUpdater的第3个参数。(SimplePixelUpdater.java:17)   在   com.infojolt.imageencrypt.Injection.ImageEncryptModule.configure(ImageEncryptModule.java:18)

PixelShiftImageEncrypter中,ImageUpdaterFactory imageUpdaterFactory传递给构造函数:

@Inject
PixelShiftImageEncrypter(PixelShiftCalculator pixelShiftCalculator,
                                ImageLoader imageLoader,
                                StringEncryption stringEncryption,
                                PixelModificationCalculator pixelModificationCalculator,
                                PixelSkipCountCalculator pixelSkipCountCalculator,
                                ImageUpdaterFactory imageUpdaterFactory)

(我目前正在重构这个项目以减少构造函数args /方法参数的数量,但是我试图在将它拆开之前将其归入测试阶段。)

然后通过调用:

在方法中创建

ImageUpdater

ImageUpdater imageUpdater = imageUpdaterFactory.create(image);

PixelShiftImageEncrypter创建于:

@Inject
EncryptJobConfiguration(@Assisted("inputString") String inputString,
                        @Assisted("secretKey") String secretKey,
                        @Assisted("inputImagePath") String inputImagePath,
                        ImageEncrypter imageEncrypter,
                        ImageStorage imageStorage)

ImageEncryptModule.java包含:

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

    install(new FactoryModuleBuilder()
            .implement(PixelUpdater.class, SimplePixelUpdater.class)
            .build(PixelUpdaterFactory.class));

    install(new FactoryModuleBuilder()
            .implement(ImageUpdater.class, PerPixelImageUpdater.class)
            .build(ImageUpdaterFactory.class));

PixelUpdaterFactory

public interface PixelUpdaterFactory {
    PixelUpdater create(BufferedImage image);
}

JobConfigurationFactory

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);
}

此文件还包含我为简洁起见而排除的所有其他绑定。例如:

bind(ImageEncrypter.class).to(PixelShiftImageEncrypter.class);

1 个答案:

答案 0 :(得分:2)

问题是我以为我已经取代了:

bind(ImageUpdater.class).to(PerPixelImageUpdater.class);

使用:

install(new FactoryModuleBuilder()
                .implement(ImageUpdater.class, PerPixelImageUpdater.class)
                .build(ImageUpdaterFactory.class));

但是,原始绑定尚未删除。删除这两行解决了这个问题:

bind(ImageUpdater.class).to(PerPixelImageUpdater.class);
bind(PixelUpdater.class).to(SimplePixelUpdater.class);