1

2 つのコンストラクターを持つクラスがあります。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 クラスにはコンストラクターがないことに注意してください。public メソッドがあるだけで、それだけです。

4

1 に答える 1

5

2 つの問題があります。

問題 1:ファクトリ メソッドに注釈を付ける必要はありません@Assisted

問題 2: Guice はJsonMapperImpl、ファクトリを使用するときのインスタンスを作成しようとします。JsonMapperImplで注釈が付けられた適切なコンストラクターをスキャンします@AssistedInject。ありません。new JsonMapperImpl("xyz")たとえば、 を呼び出すことはできません。The constructor JsonMapperImpl(String) is undefinedであるため、これはコンパイル時エラーになります。

@AssistedInjectまた、 in で注釈が付けられたコンストラクターもありません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

お役に立てれば。

于 2016-12-21T10:46:35.500 に答える