java - 将类强制转换为 Spring 中的接口(interface)

标签 java spring osgi confluence

我因 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/

相关文章:

java - Spring 从 Retrofit 获取 Null 值

java - 是否有必要为每个错误创建用户定义的异常

embed - 在 OSGi 包中嵌入 jar 时,忽略还是可选解析?

java - Felix 如何查看 bundle ?

java - 不使用 Lambda 表达式对流进行模型映射

java - docker中运行的应用程序无法与elasticsearch docker连接

java - 是否可以从 Java 在 MySQL 中创建新帐户?

java - UnsatisfiedLinkError - 此错误意味着什么?每个提示都很有用!

spring - Grails:声明式事务

javascript - Liferay 7 CE - Osgi 模块(liferay mvc portlet)不加载 javascript 文件