当前位置: 首页 > 知识库问答 >
问题:

Guice assistedinject 已配置

丁俊智
2023-03-14

我有一个AssistedInject的问题。我按照这个链接上的说明https://github.com/google/guice/wiki/AssistedInject但是当我运行我的应用程序时,我得到一个错误:

ERROR [2015-04-23 14:49:34,701] com.hubspot.dropwizard.guice.GuiceBundle: Exception occurred when creating Guice Injector - exiting
! com.google.inject.CreationException: Unable to create injector, see the following errors:
!
! 1) A binding to java.lang.String annotated with @com.google.inject.assistedinject.Assisted(value=) was already configured at com.demo.migrator.service.democlient.DemoAPIFactory.create().
!   at com.demo.migrator.service.democlient.DemoAPIFactory.create(DemoAPIFactory.java:1)
!   at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:577)
!   at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335) (via modules: com.demo.migrator.MigrationModule -> com.google.inject.assistedinject.FactoryModuleBuilder$1)

以下是我的模块配置:

install(new FactoryModuleBuilder()
    .implement(DemoAPI.class, DemoClient.class)
    .build(DemoAPIFactory.class));

这是我的工厂的样子:

 public interface DemoAPIFactory {
   DemoAPI create(String _apiKey, String _secretKey);
 }

接口声明如下:

public interface DemoAPI {
   //list of interface methods
}

这是实现

 @Inject
public DemoClient(@Assisted String _apiKey, 
       @Assisted String _secretKey) {
    secretKey = _secretKey;
    apiKey = _apiKey;
    baseURL = "xxxxx";
    expirationWindow = 15;
    roundUpTime = 300;
    base64Encoder = new Base64();
    contentType = "application/json";
}

我正在使用dropwizard guice捆绑包。

为什么会发生此错误?

共有1个答案

程钧
2023-03-14

这是一个常见问题,解决方案记录在javadoc中:

使参数类型不同

工厂方法的参数类型必须不同。要使用同一类型的多个参数,请使用命名的@Assisted批注来消除参数的歧义。这些名称必须应用于工厂方法的参数:

 public interface PaymentFactory {
    Payment create(
        @Assisted("startDate") Date startDate,
        @Assisted("dueDate") Date dueDate,
        Money amount);    } 

…以及具体类型的构造函数参数:

public class RealPayment implements Payment {
  @Inject
  public RealPayment(
     CreditService creditService,
     AuthService authService,
     @Assisted("startDate") Date startDate,
     @Assisted("dueDate") Date dueDate,
     @Assisted Money amount) {
     ...
  }    }
 类似资料:
  • 问题 使用CDI,我希望生成bean。 此外,我希望为注入点提供配置注释,例如: 我不想为的每个不同可能性编写一个单独的生产者。 方法 通常的方法是创建一个生产者并处理注入点注释: 因此,bean不能再被应用程序限定范围,因为每个注入点可能不同(producer的参数injectionpoint不适用于注释的生产者)。 所以这个解决方案不起作用。 问题 我需要具有相同值的注入点获得相同bean实例

  • Spring Security的Java配置没有公开每个配置对象的每一个属性,这简化了广大用户的配置。毕竟如果要配置每一个属性,用户可以使用标准的Bean配置。 虽然有一些很好的理由不直接暴露所有属性,用户可能任然需要更多高级配置,为了解决这个Spring Security引入了 ObjectPostProcessor 概念,用来修改或替换Java配置的对象实例。例如:如果你想在FilterSec

  • JVM规范(JSE 8版)提到: 第12页:2.5.2 JVM堆栈:“因为JVM堆栈除了用于推送和弹出帧之外,从来没有被直接操作过,所以帧可以被堆分配。” 第15页:2.6:帧:“帧是从创建帧的线程的JVM堆栈中分配的。”在第16页:“请注意,由线程创建的框架是该线程的本地框架,不能被任何其他线程引用。” 这听起来让我很困惑。既然一个帧是创建该帧的线程本地的,为什么要在堆中分配该帧,因为堆在所有J

  • 就在最近,上下文。getResources()。updateConfiguration()在Android API 25中已被弃用,我需要更改用户选择的应用程序的语言。我正在使用此方法更改语言 但由于受到了不推荐的api警告,我刚刚开始android开发。因此,任何建议都将有助于解决此警告。

  • 我有两个类使用ModelMapper将实体转换为DTO。在每个类中,我都在类的构造函数中配置了ModelMapper,以避免将所有关系转换为DTO并获得StackOverflow Error。 公司服务impl 公司利润 当我运行应用程序时,我得到一个错误: com的映射已存在。特写国际。批准dtos。公司服务模块化。setCompanyService()。 如何为ModelMapper提供两个配

  • 我运行Kafkajava客户端使用0.10.1.0。根据这里建议的配置https://cwiki.apache.org/confluence/display/KAFKA/Compression 我把 在生产者财产中。但是,当我运行时,生成器会执行配置已提供,但不是已知配置。将显示此警告。 根据API文件,http://home.apache.org/~jgus/kafka-0.10.1.0-rc0