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() 的返回值分配给了一个无类型的迭代器,而后者又被传递给了ServiceRegistry构造函数。这种技术给我同样的错误。

最后,如果这很重要,我将在 Eclipse Gallileo(内部版本 20100218-1602)中运行它。

问候,德鲁

4

2 回答 2

2

我以前从未使用过这个 SPI 类,但是,从API 文档中,构造函数ServiceRegistry接受了一个Iterator类别,而不是提供者。您可能想注册您的提供商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 回答