尝试使用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)中运行它。
此致 德鲁
答案 0 :(得分:2)
我之前从未使用过这个SPI类,但是,ServiceRegistry
的构造函数Iterator
的{{1}}带有类别,而不是提供者。您可能希望使用registerServiceProviders()
注册您的提供商?
答案 1 :(得分:0)
构造函数确实期望“类别”列表,即注册表可以搜索的接口。一旦我纠正了那部分,并按照你所说的那样填充了ServiceRegistry,其余部分效果很好。
新代码:
private void loadProviders() throws ClassNotFoundException {
Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator();
_serviceRegistry = new ServiceRegistry(iterCategories);
_serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
}