O construtor ServiceRegistry falha com ClassCastException na classe concreta
-
26-09-2020 - |
Pergunta
Tentando usar javax.imageio.spi.ServiceRegistry
registrar dinamicamente processadores de solicitação para um HttpServlet
:
private static final Class PROVIDER_CLASS = IRequestProcessor.class;
private void loadProviders() throws ClassNotFoundException {
_serviceRegistry = new ServiceRegistry(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
}
O erro que recebo é:
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)
A classe GetStandardCodesProcessor
implementos IRequestProcessor
.A chamada ServiceRegistry.lookupProviders()
está obtendo uma lista de classes do arquivo META-INF/services/org.confused.servlet.IRequestProcessor
.Parece que estou faltando uma nuance sobre como passar o iterador de ServiceRegistry.lookupProviders()
.
Esta página mostra praticamente o que estou fazendo, embora atribuindo o retorno de lookupProviders() a um Iterator não digitado, que por sua vez é passado para o ServiceRegistry
construtor.Essa técnica dá o mesmo erro para mim.
Por último, estou executando isso no Eclipse Gallileo (build 20100218-1602), se isso for importante.
Atenciosamente, Drew
Solução
Eu nunca usei essa classe SPI antes, no entanto, desde o Documentação da API, o construtor de ServiceRegistry
leva em um Iterator
com categorias, não com fornecedores.Você pode querer registrar seus provedores com registerServiceProviders()
em vez de?
Outras dicas
yclian, obrigado pela "pancada na cabeça".
O construtor está de fato esperando a lista de 'categorias', que são as interfaces que o registro pode procurar.Depois de corrigir essa parte e preencher o ServiceRegistry como você disse, o resto funciona muito bem.
O novo código:
private void loadProviders() throws ClassNotFoundException {
Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator();
_serviceRegistry = new ServiceRegistry(iterCategories);
_serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
}