2014-10-04 32 views
0

我用ClassCastException打牆,想知道我做錯了什麼。 我有一個API接口在春天澆鑄一個接口類

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

由類

public class ServiceImpl implements MyService{ 
    //methods here 
} 

延伸通過另一個實施:

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

和在彈簧的components.xml現在

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

在另一個插件在我想獲得服務,所以我正在調用

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 2014-10-04 08:39:15

+0

'getServiceReference(Service.class.getName());',你在這裏使用了什麼'Service'? [This one](http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/stereotype/Service.html)? – 2014-10-04 08:42:38

+0

也許應該是MyService.class而不是Service.class? – John 2014-10-04 08:45:37

回答

1

您的代碼似乎是正確的。問題在於管理你的包裝進口/出口。

這通常發生在類MyService.class有兩個實例時。查看提供該服務的軟件包以及使用該服務的軟件包。

如果你沒有單獨的API包,那麼提供服務的包應該包含MyService.class並導出它所在的包。使用該服務的包不應包含MyService.class並導入它所在的包

還要確保MyService.class的包與impl和using類不在同一個包中 - 我認爲應該是這樣,因爲包名聽起來像是一個API包名。

+0

我記得在某處閱讀了您描述的這兩個實例問題。MyService,ServiceImpl和ExtendedServiceImpl在同一個項目下,而我試圖從另一個項目中獲取服務。您是否會善意指出您提到的這些包裝進口/出口的文件? – 2014-10-04 09:59:03

+0

我假設你使用maven bundle插件來創建bundle。在這種情況下,請參閱maven bundle插件的文檔:http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html 您還應該檢查創建的jar的Manifest文件爲您的服務和客戶端。如果你想要,你可以在這裏發佈Manifest內容,我看看。 – 2014-10-04 10:42:01

+0

我在你指出的pom導入/導出上做了一些改動(很多感謝btw),現在讓構造函數拋出異常;嵌套異常是org.springframework.aop.AopInvocationException:AOP配置似乎是無效的:嘗試調用方法嵌套異常是java.lang.IllegalArgumentException:對象不是聲明類的實例。我在編輯原始問題以包含清單 – 2014-10-04 13:59:27