Сбой конструктора ServiceRegistry с ClassCastException для конкретного класса - PullRequest
0 голосов
/ 22 июля 2010

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

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

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

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

0 голосов
/ 22 июля 2010

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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...