2010-07-21 1 views
0

Попытка использовать 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), если это имеет значение.

С уважением, Дрю

ответ

2

Я никогда не использовал этот класс SPI раньше, однако, из API documentation, конструктор ServiceRegistry принимает в Iterator с категориями, а не поставщиками. Возможно, вы захотите зарегистрировать своих поставщиков с помощью registerServiceProviders()?

+0

Спасибо, что нашли время, чтобы ответить. Хотя я мог бы «вручную» добавлять классы через registerServiceProviders(), я хотел воспользоваться преимуществами распознавания автоматического класса, которые предлагает ServiceRegistry.lookupProviders(). Я думал, что Iterator в ServiceRegistry (Iterator >) должен был быть списком классов для регистрации; он ищет интерфейсы вместо этого? – Werd

+0

Но, по правде говоря, конструктор (Iterator >) не предназначен для поставщиков, чтобы регистрироваться, но категорий поставщиков. – yclian

+0

Спасибо, теперь я понимаю. Я бы ответил на ваш ответ, но пока я не достоин. :( – Werd

1

yclian, спасибо за «bonk on the head».

Конструктор действительно ожидает список «категорий», которые являются интерфейсами, которые может выполнять поиск в реестре. Как только я исправил эту часть и заполнил ServiceRegistry, как вы сказали, остальное отлично работает.

Новый код:

private void loadProviders() throws ClassNotFoundException { 
    Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator(); 
    _serviceRegistry = new ServiceRegistry(iterCategories); 
    _serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS)); 
} 
Смежные вопросы