尝试使用 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)中运行它。

问候,德鲁

有帮助吗?

解决方案

然而,我以前从未使用过这个 SPI 类 API文档, ,构造函数 ServiceRegistry 接受一个 Iterator 具有类别,而不是提供者。您可能想向您的提供商注册 registerServiceProviders() 反而?

其他提示

yclian,谢谢你的“头疼”。

构造函数确实需要“类别”列表,即 接口 注册表可以搜索到的。一旦我更正了该部分,并按照您所说填充了 ServiceRegistry,其余的工作就很好了。

新代码:

private void loadProviders() throws ClassNotFoundException {
    Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator();
    _serviceRegistry = new ServiceRegistry(iterCategories);
    _serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top