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类没有构造函数.它只是一个公共方法,就是这样.
我看到两个问题.
问题1:您无需使用注释工厂方法@Assisted
问题2: Guice将尝试JsonMapperImpl
在您使用工厂时创建一个意义.它将扫描JsonMapperImpl
注释的适当的构造函数@AssistedInject
.没有了.new JsonMapperImpl("xyz")
例如,您无法调用.这将是编译时错误,因为构造函数JsonMapperImpl(String)未定义.
您也没有使用@AssistedInject
in 标注的构造函数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)
希望这可以帮助.