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

带有多个构造函数的Guice辅助注入总是调用默认的构造函数

公孙弘图
2023-03-14

我有一个有两个构造函数的类。我正在尝试使用 guice 工厂创建此类的实例。如果未传递任何参数,则应调用默认构造函数。如果传递了参数,则应调用带参数的构造函数。但目前即使我将参数传递给工厂方法,仍然会调用默认构造函数。带参数的构造函数根本不被调用。下面是我的工厂类。

public interface MapperFactory {

PigBagMapper createPigBagMapper(@Assisted("pigMetaInfoList") List<String> sourceMetaInfoList);

JsonMapper createJsonMapper(@Assisted("apiName") String apiName) throws EndpointNotFoundException, JsonMapperException;

JsonMapper createJsonMapper();

}

以下是我尝试注入的构造函数。

@AssistedInject
public JsonMapper() {
    handlers = new LinkedList<>();
}

 @AssistedInject
 public JsonMapper(@Assisted("apiName") String apiName) throws EndpointNotFoundException, JsonMapperException {
    somelogic();
}

下面是我在抽象模块实现类中的模块绑定。

install(new FactoryModuleBuilder()
            .implement(PigBagMapper.class, PigBagMapperImpl.class)
            .implement(JsonMapper.class, JsonMapperImpl.class)
            .build(MapperFactory.class));

下面是我如何调用构造函数。

mapperFactory.createJsonMapper(apiName);

我在这里做错了什么?任何帮助都将不胜感激。

编辑:

请注意,JsonMapperImpl类没有构造函数。它只有一个公共方法,仅此而已。

共有1个答案

伯逸明
2023-03-14

我看到两个问题。

问题1:您不需要用< code>@Assisted注释工厂方法

问题2:当您使用工厂时,Guice将尝试创建JsonMapperImpl的isn值。它将扫描用@AssistedInject注释的正确的JsonMapperImpl构造函数。没有。例如,您不能调用new JsonMapperImpl("xyz")。这将是编译时错误,因为构造函数JsonMapperImpl(String)未定义。

您也没有在 JsonMapperImpl 中使用 @AssistedInject 注释的构造函数。它是空的。

如果您以类似的方式重写您的类:

public class JsonMapperImpl extends JsonMapper
{
    @AssistedInject
    public JsonMapperImpl() {
        super();
    }

     @AssistedInject
     public JsonMapperImpl(@Assisted String apiName) {
         super(apiName);
    }
}

和:

public class JsonMapper
{
    private String apiName;

    public JsonMapper() {

    }

     public JsonMapper(String apiName) {
         this.apiName = apiName;
    }

    public String getAPI(){return apiName;}
}

然后 JsonMapperImpl 将公开适当的构造函数,代码将起作用,例如:

JsonMapper noApi = factory.createJsonMapper();
JsonMapper api = factory.createJsonMapper("test");

System.out.println(noApi.getAPI());
System.out.println(api.getAPI());

输出:

null
test

希望这有帮助。

 类似资料:
  • 有人能帮助实现没有注释的Guice吗? pom。xml 我所尝试的: 我得到的错误是: 我理解这个错误。 但是我希望我可以“指向”Guice到正确的构造函数......而不是使用注释。 如您所见,使用默认/空构造函数不是一个好选择,因为这个示例很简单,但我想坚持使用基于构造函数的注入。 附加: 根据我在评论中从赫曼特·辛格那里得到的“暗示”,我想我离得更近了。 我创建了一个ProductionIn

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 为什么: 如果一个类不提供任何然后在编译时由编译器给出,但是如果一个类包含,那么默认构造函数不是由编译器提供。 我正在编译下面的代码。它给出了编译错误。 代码: 控制台错误: 当我只调用。工作正常。但是当您想使用参数化构造函数调用

  • 问题内容: 假设我有一些类似以下的课程。(为简单起见,这是一个虚构类。) 由于我使用不同的实现,并且可能想对该发送功能进行单元测试,因此我认为我应该注入in 的方法。但是我该怎么做呢? 我见过的所有我理解的Guice示例似乎都是在构造函数中进行注入的: 但是我的类在其构造函数中接受了一个参数,我不想注入该参数。那我该怎么办呢? (注意:我是一个完整的Google Guice noob。我认为我了解

  • 问题内容: 默认构造函数到底是什么?你能告诉我以下哪个是默认构造函数,它与其他构造函数有何不同? 问题答案: 他们都不是。如果定义,则不是默认值。 除非你定义另一个构造函数,否则默认构造函数是自动生成的无参数构造函数。任何未初始化的字段都将设置为其默认值。对于你的榜样,它看起来像这样假设的类型String,int以及int,那类本身是公共的: 这与 完全没有构造函数。但是,如果定义至少一个构造函数

  • 问题内容: 我知道我在这里问一些严重的101问题… 我有一些课,还有一个延伸课。在我有一个构造函数,它接受一组参数,并对其字段进行设置。派生类(例如)通常不需要进行修改。现在我的IDE给我 “ Foo中没有默认的构造函数” 。从一点点谷歌搜索,这似乎是因为“构造函数没有继承”。因此,一切都很好,但是我现在如何使它工作而不在每个派生类中复制此构造函数?我假设有一个更合理的方法? 问题答案: 使用构造