1

私は2つのコンストラクタを持つクラスを持っています。私はこのクラスのインスタンスを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); 

私はここで間違っていますか?どんな助けでも大歓迎です。

EDIT:

JsonMapperImplクラスにはコンストラクタがありませんのでご注意ください。それは公の方法だけであり、それだけです。

答えて

4

2つの問題があります。

問題1: 2あなたは@Assisted

を発行してファクトリメソッドに注釈を付ける必要はありません。はGuiceのは、あなたが工場を使用するときJsonMapperImplのisntanceを作成しようとします。 @AssistedInjectと注釈された適切なJsonMapperImplのコンストラクタをスキャンします。誰もいません。たとえば、new JsonMapperImpl("xyz")を呼び出すことはできません。 コンストラクタJsonMapperImpl(String)が未定義のため、コンパイル時エラーです。

@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が適切なコンストラクタを公開し、コードが動作します、例えば:

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

System.out.println(noApi.getAPI()); 
System.out.println(api.getAPI()); 

出力:

null 
test 

希望すると便利です。

関連する問題