1

我有一個有兩個構造函數的類。我正在嘗試使用guice factory來創建這個類的實例。如果沒有參數傳遞,那麼應該調用默認的構造函數。如果傳遞了一個參數,那麼應該調用帶有參數的構造函數。但是,即使我將參數傳遞給工廠方法,仍然默認構造函數被調用。帶參數的構造函數根本不會被調用。以下是我的工廠班。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類沒有構造函數。它只是有一個公共的方法,就這些。

回答

4

我看到兩個問題。

問題1:你不需要用@Assisted

問題註釋工廠方法2:吉斯會嘗試當您使用工廠創建的JsonMapperImpl的isntance。它會掃描正確的JsonMapperImpl構造註釋與@AssistedInject。沒有了。例如,您不能調用new JsonMapperImpl("xyz")。這將是編譯時錯誤,因爲構造函數JsonMapperImpl(String)未定義爲

您也沒有帶@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 

希望這會有所幫助。