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



我有一个具有两个构造函数的类。我正在尝试使用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:您不需要用@Assisted

注释出厂方法

问题2: GUICE在使用工厂时会尝试创建JsonMapperImpl的界限。它将扫描以适当的 JsonMapperImpl @AssistedInject注释的概要。没有了。例如,您无法调用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

希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新