2010-07-21 63 views
0

嘗試使用javax.imageio.spi.ServiceRegistry動態註冊請求處理器爲HttpServletServiceRegistry構造失敗,並拋出ClassCastException混凝土類

private static final Class PROVIDER_CLASS = IRequestProcessor.class; 

private void loadProviders() throws ClassNotFoundException { 
    _serviceRegistry = new ServiceRegistry(ServiceRegistry.lookupProviders(PROVIDER_CLASS)); 
} 

我得到的錯誤是:

java.lang.ClassCastException: org.confused.servlet.GetStandardCodesProcessor 
javax.imageio.spi.ServiceRegistry.<init>(ServiceRegistry.java:103 
org.confused.servlet.MyServlet.loadProviders(.java:100) 
org.confused.servlet.MyServlet.checkProviders(.java:106) 
org.confused.servlet.MyServlet.service(.java:44) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:802) 

GetStandardCodesProcessor實現IRequestProcessor。 電話ServiceRegistry.lookupProviders()正在從文件META-INF/services/org.confused.servlet.IRequestProcessor獲取類別列表。 看來我錯過了一個關於如何從ServiceRegistry.lookupProviders()傳入迭代器的細微差別。

This page顯示了我正在做的事情,雖然將lookupProviders()的返回值分配給了一個無類型的迭代器,而後者又被傳遞給ServiceRegistry的構造器。這種技術給我同樣的錯誤。

最後,我在Eclipse Gallileo(build 20100218-1602)中運行此操作,如果這很重要的話。

問候, 德魯

回答

2

我從來沒有使用過這種SPI類,但是,從API documentationServiceRegistry構造發生在一個Iterator與類別,而不是供應商。您可能想用registerServiceProviders()來註冊您的供應商嗎?

+0

感謝您抽出寶貴時間來回答。 雖然我可以通過registerServiceProviders()手動添加類,但我期待利用ServiceRegistry.lookupProviders()提供的automagic類識別優勢。我認爲ServiceRegistry中的迭代器(迭代器>)預計將成爲要註冊的類的列表;它是在尋找接口嗎? – Werd 2010-07-22 13:28:12

+0

但事實是,構造函數(Iterator >)不是供提供者註冊的,而是提供者的類別。 – yclian 2010-07-22 13:32:14

+0

謝謝,現在我明白了。 我會+1你的答案,但我還不配。 :( – Werd 2010-07-22 13:42:15

1

yclian,感謝您的「頭上的鼓掌」。

該構造函數確實期望「類別」列表,它是註冊表可以搜索的接口。一旦我糾正了這個部分,並按照你所說的填充了ServiceRegistry,其餘的工作就很好。

新代碼:

private void loadProviders() throws ClassNotFoundException { 
    Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator(); 
    _serviceRegistry = new ServiceRegistry(iterCategories); 
    _serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS)); 
}