ServiceRegistry Konstruktor schlägt mit ClassCastException für konkrete Klasse fehl
-
26-09-2020 - |
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
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));
}