ServiceRegistry构造函数在具体类上失败并带有ClassCastException

时间:2010-07-21 21:17:55

标签: java classcastexception jmf service-provider

尝试使用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()传递迭代器的细微差别。

This page显示了我正在做的事情,虽然将lookupProviders()的返回值分配给非类型化的迭代器,后者又传递给ServiceRegistry构造函数。那种技术给我带来了同样的错误。

最后,如果重要的话,我在Eclipse Gallileo(build 20100218-1602)中运行它。

此致 德鲁

2 个答案:

答案 0 :(得分:2)

我之前从未使用过这个SPI类,但是,ServiceRegistry的构造函数Iterator的{​​{1}}带有类别,而不是提供者。您可能希望使用registerServiceProviders()注册您的提供商?

答案 1 :(得分: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));
}