用子类替换Spring Bean时出错

时间:2013-04-08 18:35:49

标签: java spring testing

我正在打电话给网络服务;我们使用配置了注释的Spring bean来实现调用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]

我再次尝试将一个显式的“在我的子类上实现XService,结果相同。

我在Spring做违法行为吗?原始的XServiceImpl中有许多@Resource注释;我不认为这很重要,我希望他们像以前一样注射。

有没有办法做我想做的事情,哪个测试类有一个绝对最小化的原始变化? (我会考虑在XML中进行配置,除了我没有在我正在进行的项目中做出这些决定,但我认为这对我正在尝试做的事情并不重要。


额外的困惑:错误消息显示“Bean named'xService'必须是... XService类型,但实际上是XServiceImplTest类型”。但XServiceImplTest实现XService,就像XServiceImpl一样。

额外的困惑#2:我将整个XServiceImpl复制到XServiceImplTest类,从XServiceImpl注释掉注释,并清理并重建并运行。得到了相同的结果。现在两个类之间的唯一区别是它们的类名。它变得陌生和陌生。任何人都可以建议为什么Spring可能会关心类名是什么?

2 个答案:

答案 0 :(得分:1)

我看到三个可能的原因:

  1. 您的代码看起来与您正在显示的代码不同,并且继承层次结构不存在。 (既然你说你直接添加了界面,这是不太可能的,但你可能想要仔细检查你的导入)

  2. 类路径上有旧的编译类。如果XServiceImplTest周围有一个旧的编译版本,则可能会被拾取。尝试清除所有类/目标文件夹。

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

    您可以在任何感兴趣的实例上执行x.getClass().getClassLoader()。在普通的vanilla应用程序中,这将为所有x返回相同的实例。在OSGI应用程序和Web应用程序中,您可能会获得不同的ClassLoader。 ClassLoader的类型及其父关系应该提供一些关于发生了什么的提示。

答案 1 :(得分:0)

他们不能有相同的名字。您正在为这两个类调用“xService”。 例如,您可以为子类赋予不同的名称“xServiceTest”,并使用@Qualifier注入该子类。 其他的事情,我不是100%肯定,但我认为你可能有这种继承的问题。如果有,只需创建一个具有所有常见实现的抽象类,然后创建2个子类,即服务和测试。

希望这有帮助。

<强> [UPDATE]

  

有人可以建议为什么Spring会关心班级名称是什么吗?

您可以检查配置中是否存在奇怪的context:component-scan条目。检查您是否定义了以下内容:

 <context:component-scan resource-pattern="<path>/*Impl.class" ...> 

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