서비스 레지스트리를 따라 생성자 실패와 ClassCastException 콘크리트 클래스
-
26-09-2020 - |
문제
하려고 사용 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),경우에는 문제입니다.
감사합니다, 린
해결책
나는 사용하지 않은 이 SPI 클래스하기 전에,그러나, API 설명서, 생성자의 ServiceRegistry
에 걸리 Iterator
카테고리,지 않 공급자입니다.할 수 있습 등록하려는 귀하의 공급자 registerServiceProviders()
까요?
다른 팁
yclian,감사"와 플레에서"머리.
생성자를 실제로 기대 목록의'종류',는 인터페이스 는 레지스트리를 검색 할 수 있습니다.면 나는 수정되는 부분을,그리고 채워 서비스 레지스트리를 따라 당신이 말했듯이,나머지는 잘 작동합니다.
새 코드:
private void loadProviders() throws ClassNotFoundException {
Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator();
_serviceRegistry = new ServiceRegistry(iterCategories);
_serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS));
}