Попытка использовать javax.imageio.spi.ServiceRegistry
динамически регистрировать запрос процессоров для HttpServlet
:ServiceRegistry конструктор терпит неудачу с ClassCastException на конкретный класс
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() в нетипизированный Iterator, который, в свою очередь, передается конструктору ServiceRegistry
. Эта техника дает мне такую же ошибку.
Наконец, я запускаю это в Eclipse Gallileo (сборка 20100218-1602), если это имеет значение.
С уважением, Дрю
Спасибо, что нашли время, чтобы ответить. Хотя я мог бы «вручную» добавлять классы через registerServiceProviders(), я хотел воспользоваться преимуществами распознавания автоматического класса, которые предлагает ServiceRegistry.lookupProviders(). Я думал, что Iterator в ServiceRegistry (Iterator>) должен был быть списком классов для регистрации; он ищет интерфейсы вместо этого? –
Werd
Но, по правде говоря, конструктор (Iterator>) не предназначен для поставщиков, чтобы регистрироваться, но категорий поставщиков. –
yclian
Спасибо, теперь я понимаю. Я бы ответил на ваш ответ, но пока я не достоин. :( – Werd