gpt4 book ai didi

java - 用子类替换 Spring Bean 时出错

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:32 25 4
gpt4 key购买 nike

我有一个网络服务的工作调用;我们实现逻辑以使用配置有注解的 Spring bean 调用 Web 服务:

@ManagedResource(objectName = "bean:name=XServiceMBean")
@Service("xService")
public class XServiceImpl implements XService
{
// working code here
}

出于测试目的,我想扩展这个类并注入(inject)子类而不是这个,所以我做了:

@ManagedResource(objectName = "bean:name=XServiceMBean")
@Service("xService")
public class XServiceImplTest extends XServiceImpl
{
// working code here
}

并注释掉父类(super class)中的两条注释行。

Spring 不喜欢它。当我运行时,我得到:

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注解;我认为这无关紧要,我希望他们像以前一样接受注入(inject)。

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


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

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

最佳答案

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

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

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

  3. 您遇到了某种类型的类加载器问题,接口(interface)由与测试实现不同的类加载器加载。在抛出异常的行上放置一个断点,并检查所涉及的各种类的类加载器。

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

关于java - 用子类替换 Spring Bean 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15886426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com