ServiceRegistryコンストラクタはConcrete ClassでClasscastExceptionで失敗します
-
26-09-2020 - |
質問
javax.imageio.spi.ServiceRegistry
を使用してHttpServlet
のリクエストプロセッサを動的に登録しようとしています:
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
を実装しています。
Call ServiceRegistry.lookupProviders()
は、ファイルMETA-INF/services/org.confused.servlet.IRequestProcessor
からクラスのリストを取得しています。
それは私がServiceRegistry.lookupProviders()
からイテレータに渡す方法についてのニュアンスがありません。
このページは、私がしていることをかなり多く示しています。lookupproviders()からの戻り値をuntyped reteratorに割り当てますが、これはServiceRegistry
コンストラクタに渡されます。その技術は私に同じエラーを与えます。
最後に、それが重要であれば、私はこれをEclipse Gallileo(Build 20100218-1602)で実行しています。
ドリュー
解決
私は API Documentation 、ServiceRegistry
のコンストラクタは、プロバイダではなくカテゴリを含むIterator
を取ります。代わりにProviesにregisterServiceProviders()
を登録することをお勧めします。
他のヒント
YLIAN、「頭の上のボンク」をありがとう。
コンストラクタは確かに「カテゴリ」のリストを期待しており、これはレジストリが検索できるインタフェースです。私がその部分を修正したら、あなたが言ったように奉仕者に移住したら、残りは素晴らしい作品です。
新しいコード:
private void loadProviders() throws ClassNotFoundException {
Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator();
_serviceRegistry = new ServiceRegistry(iterCategories);
_serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
}
.