Java 用子类替换Springbean时出错
我有一个对web服务的工作调用;我们使用配置了注释的Springbean来实现调用web服务的逻辑:Java 用子类替换Springbean时出错,java,spring,testing,Java,Spring,Testing,我有一个对web服务的工作调用;我们使用配置了注释的Springbean来实现调用web服务的逻辑: @ManagedResource(objectName = "bean:name=XServiceMBean") @Service("xService") public class XServiceImpl implements XService { // working code here } 出于测试目的,我想扩展这个类并注入子类而不是这个,所以我做了: @ManagedResource(
@ManagedResource(objectName = "bean:name=XServiceMBean")
@Service("xService")
public class XServiceImpl implements XService
{
// working code here
}
出于测试目的,我想扩展这个类并注入子类而不是这个,所以我做了:
@ManagedResource(objectName = "bean:name=XServiceMBean")
@Service("xService")
public class XServiceImplTest extends XServiceImpl
{
// working code here
}
并注释掉了超类中的两条注释行
春天不喜欢它。当我跑步时,我得到:
Error creating bean with name 'xService':Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'xService' must be of type [com.hsc.correspondence.rules.XService], but was actually of type [com.hsc.correspondence.rules.impl.XServiceImplTest]
我再次尝试在我的子类上放置一个显式的“implements XService”,结果是一样的
我在春季做了什么违法的事情吗?最初的XServiceImpl中有许多@Resource注释;我认为这无关紧要,我希望它们像以前一样被注入
有没有一种方法去做我想做的事情,这是一个测试类,它对原始数据有最小的改变?(我会考虑在XML中进行配置,除非我在项目中没有做出这些决定,但是我不认为这对我要做的事情有什么影响。
额外的困惑:错误消息说“名为'xService'的Bean必须是类型…xService,但实际上是类型XServiceImplTest”。但是XServiceImplTest实现了xService,就像XServiceImpl一样
另一个困惑#2:我将整个XServiceImpl复制到类XServiceImplTest中,注释掉了XServiceImpl中的注释,然后清理、重建并运行。得到了相同的结果。现在两个类之间的唯一区别是它们的类名。它变得越来越陌生。有人能解释为什么Spring会关心e类名称为?它们不能具有相同的名称。您正在对这两个类调用“xService”。 例如,您可以给子类一个不同的名称“xServiceTest”,并使用@Qualifier注入该名称。 另外,我不是100%确定,但我认为这种继承可能会有问题。如果有问题,只需创建一个具有所有通用实现的抽象类,然后创建两个子类,即服务和测试 希望这有帮助 [更新] 有人能解释为什么Spring可能关心类名是什么吗 您可以在配置中检查怪异的
context:component scan
条目。检查您是否定义了如下内容:
<context:component-scan resource-pattern="<path>/*Impl.class" ...>
和/或某些特定的包含/排除标准。我认为有三种可能的原因:
x.getClass().getClassLoader()来实现这一点
在任何感兴趣的实例上。在普通的应用程序中,这将为所有x返回相同的实例。在OSGI应用程序和web应用程序中,您可能会得到不同的类加载器。类加载器的类型及其父关系应该给出一些关于发生了什么的提示OP声称他从原始类中删除了注释。正如我所说,我注释掉了一组注释,因此在每种情况下只有一个类具有“xService”名称。我不知道你所说的“这种继承”是什么意思",但我不能将功能移动到另一个类。我也不希望创建一个抽象类只是为了创建一个测试子类。1.我使用@Override,在第二个实例中,实现一个只有超类有方法的接口。2.每次构建之前都要做一些清理,尽管这是肯定的我以前犯过的错误,3.尽管我对Java很有经验,但我不知道在哪里可以找到“涉及到的各种类的类加载器”如果你能给我一个关于这方面的教程,听起来我应该知道怎么做。我也不认为这是问题所在;它可以很好地处理原始的impl类,而且它不可能由不同的类加载器加载,而不是由它的包友子类加载。你的额外困惑#2…你删除了“extends XServiceImpl”吗来自XServiceImplTest类?是的,但是感谢您的检查