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

may*_*ran 1 java constructor dependency-injection 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();

}
Run Code Online (Sandbox Code Playgroud)

下面是我想要注入的构造函数.

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

 @AssistedInject
 public JsonMapper(@Assisted("apiName") String apiName) throws EndpointNotFoundException, JsonMapperException {
    somelogic();
}
Run Code Online (Sandbox Code Playgroud)

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

install(new FactoryModuleBuilder()
            .implement(PigBagMapper.class, PigBagMapperImpl.class)
            .implement(JsonMapper.class, JsonMapperImpl.class)
            .build(MapperFactory.class));
Run Code Online (Sandbox Code Playgroud)

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

mapperFactory.createJsonMapper(apiName);
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?任何帮助将非常感激.

编辑:

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

Lac*_*lev 5

我看到两个问题.

问题1:您无需使用注释工厂方法@Assisted

问题2: Guice将尝试JsonMapperImpl在您使用工厂时创建一个意义.它将扫描JsonMapperImpl注释的适当的构造函数@AssistedInject.没有了.new JsonMapperImpl("xyz")例如,您无法调用.这将是编译时错误,因为构造函数JsonMapperImpl(String)未定义.

您也没有使用@AssistedInjectin 标注的构造函数JsonMapperImpl.它是空的.

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

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

     @AssistedInject
     public JsonMapperImpl(@Assisted String apiName) {
         super(apiName);
    }
}
Run Code Online (Sandbox Code Playgroud)

和:

public class JsonMapper
{
    private String apiName;

    public JsonMapper() {

    }

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

    public String getAPI(){return apiName;}
}
Run Code Online (Sandbox Code Playgroud)

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

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

System.out.println(noApi.getAPI());
System.out.println(api.getAPI());
Run Code Online (Sandbox Code Playgroud)

输出:

null
test
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.