2015-11-25 92 views
1

在AbstractBinder的實現中,可以使用類型參數綁定類嗎?JAX-RS在ApplicationBinder中綁定泛型類型的實現

通用倉儲類
public class Repository<T>{ ... }

服務類

public class AccountService{ 

    Repository<User> repository; 

    @Inject 
    public AccountService(Repository<User> repository){ 
     this.repository = repository; 
    } 

} 

在粘結劑綁定通用倉庫

public class ApplicationBinder extends AbstractBinder { 

@Override 
protected void configure() { 
     bind(Repository<User,Long>).to(Repository<User,Long>.class); <=== not working! 
} 

回答

0

您可以使用TypeLiteral

支持使用實際類型參數表示參數化類型的對象的內聯實例化。表示任何參數化類型的對象可以通過子類別TypeLiteral獲得。

TypeLiteral<List<String>> stringListType = new TypeLiteral<List<String>>() {}; 

代替bind而且,你將需要使用bindAsContract(TypeLiteral),因爲沒有bind方法接受一個TypeLiteral[]

bindAsContract(new TypeLiteral<Repository<User, Long>>(){}); 

[] - 參見更AbstractBinder文檔。

+0

謝謝!這完成了這項工作。我不明白文檔解釋之間的區別:bind:開始構建一個新的基於類的服務綁定。不會將服務類型本身綁定爲合同類型。 bindAsContract:開始構建一個新的基於類的服務綁定。將服務類型本身綁定爲合同類型。 – erwineberhard

+0

它通常是'bind(service).to(contract)',其中'contract'通常是相同或超類型的。使用'bindAsContract',你可以跳過'to(contract)',但是限制是廣告的合約與服務類型相同,而不是使用bind(SubType.class).to(SuperType.class) ,它更像'bind(Type.class).to(Type.class)' –

+0

現在很明顯,再次感謝你。 – erwineberhard