Frage

Versuchen zu benutzen javax.imageio.spi.ServiceRegistry um Anforderungsprozessoren für eine dynamisch zu registrieren HttpServlet:

    private static final Class PROVIDER_CLASS = IRequestProcessor.class;

 private void loadProviders() throws ClassNotFoundException {
  _serviceRegistry = new ServiceRegistry(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
 }

Der Fehler, den ich bekomme, ist:

 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)

Klasse GetStandardCodesProcessor implementieren IRequestProcessor.Anruf ServiceRegistry.lookupProviders() ruft eine Liste der Klassen aus der Datei ab META-INF/services/org.confused.servlet.IRequestProcessor.Es scheint, dass mir eine Nuance fehlt, wie ich den Iterator von übergeben soll ServiceRegistry.lookupProviders().

Diese Seite zeigt ziemlich genau, was ich tue, obwohl ich die Rückgabe von lookupProviders () einem untypisierten Iterator zuweise, der wiederum an den übergeben wird ServiceRegistry Konstruktor.Diese Technik gibt mir den gleichen Fehler.

Zuletzt führe ich dies in Eclipse Gallileo (Build 20100218-1602) aus, wenn das wichtig ist.

Bezug, Zog

War es hilfreich?

Lösung

Ich habe diese SPI-Klasse jedoch noch nie zuvor von der API-Dokumentation, der Konstruktor von ServiceRegistry nimmt in einem Iterator mit Kategorien, nicht mit Anbietern.Möglicherweise möchten Sie Ihre Anbieter registrieren bei registerServiceProviders() stattdessen?

Andere Tipps

yclian, danke für den "Bonk auf den Kopf".

Der Konstruktor erwartet in der Tat die Liste der 'Kategorien', die die sind Schnittstelle nach denen die Registrierung suchen kann.Sobald ich diesen Teil korrigiert und die ServiceRegistry wie Sie sagten ausgefüllt habe, funktioniert der Rest hervorragend.

Der neue Kodex:

private void loadProviders() throws ClassNotFoundException {
    Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator();
    _serviceRegistry = new ServiceRegistry(iterCategories);
    _serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top