0

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ます。この呼び出しServiceRegistry.lookupProviders()は、ファイルからクラスのリストを取得していますMETA-INF/services/org.confused.servlet.IRequestProcessor。からイテレータを渡す方法についてのニュアンスが欠けているようですServiceRegistry.lookupProviders()

このページは、lookupProviders() からの戻り値を型指定されていない Iterator に代入し、それがServiceRegistryコンストラクターに渡されるにもかかわらず、私が行っていることのほとんどを示しています。そのテクニックは私に同じエラーを与えます。

最後に、問題があれば、これを Eclipse Gallileo (ビルド 20100218-1602) で実行しています。

よろしく、 ドリュー

4

2 に答える 2

2

私はこれまでこの SPI クラスを使用したことがありませんが、API ドキュメントから、のコンストラクターはServiceRegistryIteratorプロバイダーではなく with カテゴリを取得します。registerServiceProviders()代わりにプロバイダーを登録することをお勧めします。

于 2010-07-21T21:29:41.990 に答える
0

yclian、「ボンク・オン・ザ・ヘッド」をありがとう。

コンストラクターは実際に、レジストリが検索できるインターフェイスである「カテゴリ」のリストを期待しています。その部分を修正し、あなたが言ったようにServiceRegistryにデータを入力すると、残りはうまく機能します.

新しいコード:

private void loadProviders() throws ClassNotFoundException {
    Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator();
    _serviceRegistry = new ServiceRegistry(iterCategories);
    _serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
}
于 2010-07-22T13:40:56.847 に答える