3

我有一个网络服务的工作电话;我们使用配置了注解的 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”,结果相同。

我在春天做违法的事吗?原来的XServiceImpl里面有很多@Resource注解;我认为这并不重要,我希望他们像以前一样被注射。

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


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

额外的困惑#2:我将整个 XServiceImpl 复制到 XServiceImplTest 类中,注释掉 XServiceImpl 中的注释,然后清理并重建并运行。得到了同样的结果。现在这两个类之间的唯一区别是它们的类名。它变得越来越陌生。谁能建议为什么 Spring 可能会关心类名是什么?

4

2 回答 2

1

我看到了三个可能的原因:

  1. 您的代码看起来不像您正在显示的代码,并且继承层次结构不存在。(因为您说您直接添加了接口,所以这不太可能,但您可能需要仔细检查您的导入)

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

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

    您可以通过x.getClass().getClassLoader()对任何感兴趣的实例进行操作来做到这一点。在一个普通的 vanilla 应用程序中,这将为所有 x 返回相同的实例。在 OSGI 应用程序和 Web 应用程序中,您可能会得到不同的 ClassLoader。ClassLoader 的类型和它们的父关系应该给出一些关于正在发生的事情的提示。

于 2013-04-08T18:47:04.573 回答
0

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

希望这可以帮助。

[更新]

谁能建议为什么 Spring 可能会关心类名是什么?

您可以检查您的配置是否有奇怪的context:component-scan条目。检查您是否定义了这样的内容:

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

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

于 2013-04-08T18:46:17.020 回答