Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将类强制转换为spring中的接口_Java_Spring_Osgi_Confluence - Fatal编程技术网

Java 将类强制转换为spring中的接口

Java 将类强制转换为spring中的接口,java,spring,osgi,confluence,Java,Spring,Osgi,Confluence,我带着一个ClassCastException撞到了墙上,想知道我做错了什么。 我有一个API接口 public interface MyService{ method A() method B() } 由类实现 public class ServiceImpl implements MyService{ //methods here } 由另一个扩展: @Component("service") public class ExtendedServiceImpl e

我带着一个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
}
在spring-components.xml中

<osgi:service ref="service"
    interface="my.package.api.MyService" />
这会引发ClassCastException。我可以通过控制台打印看到s_引用的类型是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.override


希望有帮助:)

您的代码似乎是正确的。问题在于如何管理包导入/导出

当类MyService.class有两个实例时,通常会发生这种情况。查看提供服务的捆绑包和使用服务的捆绑包

如果没有单独的API包,那么提供服务的包应该包含MyService.class并导出它所在的包。使用该服务的捆绑包不应包含MyService.class并导入它所在的包


还要确保MyService.class的包与impl和using类在一个单独的包中——我认为应该是这样的,因为您的包名听起来像API包名

还请发布完整的stacktrace。
getServiceReference(Service.class.getName()),您在这里使用什么
服务
?也许那应该是MyService.class而不是Service.class?@John这是我的想法。那么,这不是解决你问题的方法吗?我记得在什么地方读过你描述的两个问题实例。MyService、ServiceImpl和ExtendedServiceImpl在同一个项目下,而我正试图从另一个项目中获取服务。请您指出您提到的关于这些包导入/导出的文档,好吗?我假设您使用maven bundle插件来创建包。在本例中,请参阅maven bundle插件的文档:您还应该检查为您的服务和客户机创建的jar文件的清单。如果你愿意,你可以在这里发布清单内容,我来看看。正如你所指出的,我对pom导入/导出做了一些更改(非常感谢btw),现在得到了一个异常;嵌套异常为org.springframework.aop.aop职业异常:aop配置似乎无效:尝试调用方法嵌套异常为java.lang.IllegalArgumentException:对象不是声明类的实例。我正在编辑原始问题以包括清单。我认为您仍然存在类加载问题。客户端清单没有com.atlassian.confluence.plugins.questions.api.service的导入。服务清单看起来正常。还要确保服务接口不在客户机jar中。它应该只有导入包。
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