ServiceRegistry 构造函数在具体类上失败并出现 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
。电话 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));
}
不隶属于 StackOverflow