我因 ClassCastException 而碰壁,想知道我做错了什么。 我有一个API接口(interface)
public interface MyService{
method A()
method B()
}
由类实现
public class ServiceImpl implements MyService{
//methods here
}
由另一个扩展:
@Component("service")
public class ExtendedServiceImpl extends ServiceImpl
{
//overriden methods
}
和 spring-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 类型,我在该插件中没有引用。
编辑: 客户端的修剪 list :
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"
修剪服务 list
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 接口(interface)位于 com.atlassian.confluence.plugins.questions.api.service ServiceImpl 位于 com.atlassian.confluence.plugins.questions.service ExtendedServiceImpl 位于 com.atlassian.confluence.plugins.questions.overriden
希望有帮助:)
最佳答案
您的代码似乎是正确的。问题在于管理您的包导入/导出。
当 MyService.class 类有两个实例时,通常会发生这种情况。查看提供该服务的 bundle 以及使用该服务的 bundle 。
如果您没有单独的 API bundle ,则提供服务的 bundle 应包含 MyService.class 并导出其所在的包。使用该服务的 bundle 不应包含 MyService.class 并导入其所在的包。
还要确保 MyService.class 的包与 impl 和 using 类位于单独的包中 - 我认为应该是这样,因为您的包名称听起来像 API 包名称。
关于java - 将类强制转换为 Spring 中的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26190987/