Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.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 用子类替换Springbean时出错_Java_Spring_Testing - Fatal编程技术网

Java 用子类替换Springbean时出错

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(

我有一个对web服务的工作调用;我们使用配置了注释的Springbean来实现调用web服务的逻辑:

@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" ...> 


和/或某些特定的包含/排除标准。

我认为有三种可能的原因:

  • 您的代码看起来与您正在显示的代码不一样,并且继承层次结构也不存在。(因为您说您直接添加了接口,所以这不太可能,但您可能希望仔细检查导入)

  • 类路径上有旧的已编译类。如果XServiceImplTest周围有旧的已编译版本,则可能会被发现。请尝试清除所有类/目标文件夹

  • 您正在运行某种类型的类加载器问题,并且该接口由与测试实现不同的类加载器加载。在抛出execption的行上放置一个断点,并检查涉及的各种类的类加载器

    您可以通过执行
    x.getClass().getClassLoader()来实现这一点
    在任何感兴趣的实例上。在普通的应用程序中,这将为所有x返回相同的实例。在OSGI应用程序和web应用程序中,您可能会得到不同的类加载器。类加载器的类型及其父关系应该给出一些关于发生了什么的提示


  • OP声称他从原始类中删除了注释。正如我所说,我注释掉了一组注释,因此在每种情况下只有一个类具有“xService”名称。我不知道你所说的“这种继承”是什么意思",但我不能将功能移动到另一个类。我也不希望创建一个抽象类只是为了创建一个测试子类。1.我使用@Override,在第二个实例中,实现一个只有超类有方法的接口。2.每次构建之前都要做一些清理,尽管这是肯定的我以前犯过的错误,3.尽管我对Java很有经验,但我不知道在哪里可以找到“涉及到的各种类的类加载器”如果你能给我一个关于这方面的教程,听起来我应该知道怎么做。我也不认为这是问题所在;它可以很好地处理原始的impl类,而且它不可能由不同的类加载器加载,而不是由它的包友子类加载。你的额外困惑#2…你删除了“extends XServiceImpl”吗来自XServiceImplTest类?是的,但是感谢您的检查