2014-10-04 4 views
0

ClassCastException을 사용하여 벽을 치고 있습니다. 잘못된 것을 궁금해합니다. 나는 API 인터페이스클래스 내에서 클래스 내에서 캐스팅을 수행하십시오.

public class ServiceImpl implements MyService{ 
    //methods here 
} 

다른 확장하는 클래스에 의해 구현

public interface MyService{ 
    method A() 
    method B() 
} 

있습니다

@Component("service") 
public class ExtendedServiceImpl extends ServiceImpl 
{ 
    //overriden methods 
} 

<osgi:service ref="service" 
    interface="my.package.api.MyService" /> 

이제 스프링 components.xml에서

다른 플러그에 에서 나는 서비스에 접근하고 싶습니다. 그래서 호출하고 있습니다.

ServiceReference s_reference = context.getServiceReference(MyService.class.getName()); 
MyService s=(MyService)context.getService(s_reference); 

이것은 ClassCastException을 던집니다. 콘솔 인쇄로 볼 수 있습니다. s_reference는 해당 플러그인에서 참조가없는 ExtendedServiceImpl 유형입니다.

편집 : 클라이언트의 매니페스트 트림 가 :

Export-Service: org.hibernate.boot.registry.selector.StrategyRegistrationProvider 
Import-Package: com.atlassian.confluence.plugins.questions.overriden;version="1.0.469", com.atlassian.confluence.plugins.questions.service;version="1.0.469" 

내가 샘플 클래스를 사용하여 일부 상속 문제가있는 줄 알았는데 시작시 서비스

Bnd-LastModified: 1412434741719 
Bundle-ClassPath: .,META-INF/lib/aspectjweaver-1.8.2.jar,META-INF/lib/ 
atlassian-cache-compat-1.0.1.jar,META-INF/lib/atlassian-pocketknife-d 
ynamic-modules-0.20.jar,META-INF/lib/confluence-questions-api-1.0.469 
.jar,META-INF/lib/jooq-3.3.1.jar,META-INF/lib/jsp-api-2.0.jar 
Bundle-Description: Confluence Questions 
Bundle-DocURL: http://www.atlassian.com/ 
Bundle-License: http://www.atlassian.com/end-user-agreement/ 
Bundle-ManifestVersion: 2 
Bundle-Name: Confluence Questions Plugin 
Bundle-SymbolicName: com.atlassian.confluence.plugins.confluence-quest 
ions 
Bundle-Vendor: Atlassian 
Bundle-Version: 1.0.469 
Export-Package: 

com.atlassian.confluence.plugins.questions.api.model, 
com.atlassian.confluence.plugins.questions.overriden.admin, 
com.atlassian.confluence.plugins.questions.overriden;uses:="com.atlassian.bandana, 
com.atlassian.confluence.setup.bandana, 
com.atlassian.spring.container,com.atlassian.confluence.plugins.questions.service, 
com.atlassian.confluence.plugins.questions.api.service, 
org.springframework.beans.factory.annotation, 
com.atlassian.confluence.plugins.questions.api.model, 
com.atlassian.confluence.plugins.questions.api.repository, 
com.atlassian.confluence.plugins.questions.service.mapper, 
com.atlassian.event.api, 
com.atlassian.confluence.plugins.questions.api.permission, 
com.atlassian.confluence.user, 
com.atlassian.sal.api.message, 
com.atlassian.confluence.plugins.questions.api.dto, 
org.springframework.stereotype, 
com.atlassian.user, 
com.atlassian.hibernate, 
com.atlassian.bonnie.analyzer, 
com.atlassian.confluence.plugins.search.api";version="1.0.469", 
com.atlassian.confluence.plugins.questions.api.service 

의 매니페스트 트림. MyService 인터페이스는 com.atlassian.confluence.plugins.questions.api.service에 위치합니다. ServiceImpl은 com.atlassian.confluence.plugins.questions.service에 위치합니다. ExtendedServiceImpl은 com.atlassian.confluence.plugins.questions에 있습니다. 재정의

도움이 되길 바랍니다. :)

+0

또한 전체 스택 추적을 게시하십시오. – John

+0

'getServiceReference (Service.class.getName());',''서비스'는 여기에서 사용합니까? [이 하나] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Service.html)? –

+0

아마도 Service.class 대신 MyService.class가되어야할까요? – John

답변

1

코드가 정확합니다. 문제는 패키지 가져 오기/내보내기 관리에 관한 것입니다.

이것은 일반적으로 MyService.class 클래스의 인스턴스가 두 개인 경우에 발생합니다. 서비스를 제공하는 번들과 서비스를 사용하는 번들을 살펴보십시오.

별도의 API 번들이없는 경우 서비스를 제공하는 번들은 MyService.class를 포함하고 패키지를 내 보내야합니다. 서비스를 사용하는 번들에는 MyService.class가 포함되어 있지 않아야합니다.

MyService.class의 패키지가 impl 및 use 클래스와 별도의 패키지에 있는지 확인하십시오. 패키지 이름이 API 패키지 이름처럼 들리므로 대소 문자를 사용해야합니다.

+0

설명하는이 두 인스턴스 문제에 대해 어딘가에서 읽었습니다.MyService, ServiceImpl 및 ExtendedServiceImpl은 다른 프로젝트에서 서비스를 가져 오는 동안 동일한 프로젝트 아래에 있습니다. 언급 한 패키지 가져 오기/내보내기와 관련된 문서를 가리킬 수있을만큼 친절하십니까? –

+0

maven 번들 플러그인을 사용하여 번들을 생성한다고 가정합니다. 이 경우 maven 번들 플러그인 설명서를 참조하십시오. http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html 또한 생성 된 jar 파일의 Manifest를 확인해야합니다 귀하의 서비스와 클라이언트를위한 파일. 원할 경우 여기에 매니페스트 (Manifest) 내용을 게시 할 수 있습니다. –

+0

나는 pom import/export에 대해 몇 가지 변경을했는데 (많은 감사 btw), 이제는 Constructor가 예외를 던졌다. 중첩 예외는 org.springframework.aop.AopInvocationException입니다 : AOP 구성이 유효하지 않은 것 같습니다 : 중첩 된 예외 메소드 호출 시도가 java.lang.IllegalArgumentException 인 경우 : object가 선언 클래스의 인스턴스가 아닙니다. 매니 페스트를 포함하는 원래 질문을 편집 중입니다. –

관련 문제