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

Foi útil?

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));
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top