java - 奇怪的Guice注入(inject)错误

标签 java dependency-injection constructor guice guava

尝试使用 Guice 注入(inject)构造函数时,我遇到了一个非常奇怪的错误。构造函数中有一行如下:

@Inject
public RoundRobinAssigner(
        ... arguments
        ) {
            ...stuff

    assignments = Sets.synchronizedNavigableSet(Sets.<CountingEntry<String>>newTreeSet());
}

注入(inject)以下内容时失败。

1) Error injecting constructor, java.lang.NoSuchMethodError: com.google.common.collect.Sets.synchronizedNavigableSet(Ljava/util/NavigableSet;)Ljava/util/NavigableSet;
  at edu.harvard.econcs.turkserver.util.RoundRobinAssigner.<init>(RoundRobinAssigner.java:46)
  at edu.harvard.econcs.turkserver.util.RoundRobinAssigner.class(RoundRobinAssigner.java:40)
  while locating edu.harvard.econcs.turkserver.util.RoundRobinAssigner

但是如果我移除 Sets.synchronizedNavigableSet() 包装,注入(inject)就没问题了。

@Inject
public RoundRobinAssigner(
        ... arguments
        ) {     
            ...stuff

    assignments = Sets.<CountingEntry<String>>newTreeSet();

}

显然,这是次优的,因为我想使用同步集。有什么理由可以解释为什么被称为 Guice 的讲师的行为与普通讲师有任何不同?这些代码都没有任何编译问题,而且 guava 中的 Sets 类也已加载,所以我不知道是什么原因造成的。

最佳答案

怀疑你只是看到了一个你会在其他地方看到的问题 - 基本上是因为在通过反射加载类时涉及 Guice, 的“链接时间”错误Sets.synchronizedNavigableSet 不可用显示在 Guice 的上下文中,而不是在“正常”构造函数调用中。

synchronizedNavigableSet仅在 13.0 中引入 - 是否有可能您正在编译,但运行针对旧版本的 Guava?

关于java - 奇怪的Guice注入(inject)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15215965/

相关文章:

javascript - 带有 JavaScript 客户端的 Java 套接字服务器

c++ - 为什么要尝试调用默认构造函数?

c++ - 如何正确编写指针函数声明?

java - 如何在 Java 中比较字符串?

java - 如何使用 Glide 将 svg 图像加载到 ImageView

java - 搜索列表给出错误结果

spring ioc注入(inject)接口(interface)的具体实现来测试

c# - 根据输入在启动时切换依赖注入(inject)绑定(bind) - 好的还是坏的做法?

android - 是否可以使 Dagger 应用程序组件无效并在android中创建一个新的 Dagger 应用程序组件

java - 构造函数什么时候初始化?