Guice辅助注入多个构造函数始终调用默认构造函数

时间:2016-12-20 04:41:47

标签: java dependency-injection constructor guice assisted-inject

我有一个有两个构造函数的类。我正在尝试使用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();
}

下面是我在Abstract Module实现类的模块绑定。

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

以下是我调用构造函数的方法。

mapperFactory.createJsonMapper(apiName);

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

编辑:

请注意,JsonMapperImpl类没有构造函数。它只是一个公共方法,就是这样。

1 个答案:

答案 0 :(得分:5)

我看到两个问题。

问题1:您无需使用Object.values

注释工厂方法

问题2:当您使用工厂时,Guice会尝试创建scope.$watchCollection(function() { return Object.values(obj); }, function(newValues, oldValues) { // now you are watching all the values for changes! // if you want to fire a callback with the object as an argument: if (angular.isFunction(scope.callback())) { scope.callback()(obj); } }); 的isntance。它将扫描使用@Assisted注释的正确 JsonMapperImpl 结构。没有了。例如,您无法调用JsonMapperImpl。这将是编译时错误,因为构造函数JsonMapperImpl(String)未定义

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

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

@AssistedInject

JsonMapperImpl

然后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

希望这有帮助。