2010-07-21 2 views
0

동적으로 HttpServlet에 대한 요청 프로세서를 등록 javax.imageio.spi.ServiceRegistry를 사용하려고 구상 클래스에 ClassCastException이 실패합니다되어 ServiceRegistry 생성자는

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) 

클래스 GetStandardCodesProcessorIRequestProcessor을 구현합니다. META-INF/services/org.confused.servlet.IRequestProcessor 파일에서 을 호출하면 클래스 목록이 표시됩니다. ServiceRegistry.lookupProviders()에서 이터레이터를 전달하는 방법에 대한 미묘한 차이가 누락 된 것 같습니다.

This page은 lookupProviders()에서 반환되는 유형화되지 않은 반복기에 할당되는 것은 아니지만 내가 수행하고있는 것을 거의 보여줍니다.이 반복자는 ServiceRegistry 생성자로 전달됩니다. 그 기술은 나에게도 같은 오류를 준다.

마지막으로 Eclipse Gallileo (빌드 20100218-1602)에서이 문제를 해결하려고합니다.

감사합니다, 드류

답변

2

나는, 그러나, 전에이 SPI 클래스를 사용한 적이 한 API documentation에서 ServiceRegistry의 생성자는 범주가 아닌 업체와 함께 Iterator에 걸립니다. registerServiceProviders() 대신 제공자를 등록 하시겠습니까?

+0

감사합니다. registerServiceProviders()를 통해 클래스를 '수동으로 추가'할 수 있지만 ServiceRegistry.lookupProviders()가 제공하는 automagic 클래스 인식을 활용하려고했습니다. ServiceRegistry의 Iterator (Iterator >)가 등록 할 클래스 목록이 될 것으로 예상됩니다. 대신 인터페이스를 찾고 있습니까? – Werd

+0

사실, 생성자 (Iterator >)는 공급자가 공급자를 등록하기위한 것이 아니라 공급자 범주를 의미합니다. – yclian

+0

감사합니다. 이제는 이해합니다. 답변을 +1 하겠지만 아직 가치가 없습니다. ( – Werd

1

yclian, "bonk on the head"감사합니다.

생성자는 실제로 레지스트리가 검색 할 수있는 인터페이스 인 인 'categories'목록을 기대합니다. 일단 당신이 말한 것처럼 그 부분을 수정하고 ServiceRegistry를 채우면 나머지는 훌륭하게 작동합니다.

새로운 코드 : 답변 시간을내어

private void loadProviders() throws ClassNotFoundException { 
    Iterator iterCategories = (Collections.singletonList(PROVIDER_CLASS)).iterator(); 
    _serviceRegistry = new ServiceRegistry(iterCategories); 
    _serviceRegistry.registerServiceProviders(ServiceRegistry.lookupProviders(PROVIDER_CLASS)); 
}