尝试管理共享公共基类的多个类时出现 Spring 错误?

2024-03-28

我目前使用 Spring 3.0.x .. 我想知道这些结构有什么问题, 我想管理子类而不是父类。

我有 2 个子 DAO 扩展了 BaseDAO :

public abstract class BaseDAO<K, E> {
....
}

@Repository
public class UserDAO extends BaseDAO<String, User> {
....
}

@Repository
public class ApprovalDAO extends BaseDAO<String, Approval> {
....
}

我有这样的服务,层次结构如下:

public abstract class BaseService<K, E extends BaseEntity, D extends BaseDAO<K, E>> {
    @Autowired
    protected D dao;
....
}

public abstract class BaseCommonService<K, E extends BaseCommonEntity, D extends BaseDAO<K, E>> extends BaseService<K,E,D> {
....
}

@Service
public class UserService extends BaseCommonService<String, User, UserDAO> {
....
}

当尝试将 userservice 对象注入我的应用程序时,它会抛出如下错误:

线程“main”中的异常 org.springframework.beans.factory.BeanCreationException: 使用名称创建 bean 时出错 'testEntities':注入自动装配 依赖失败;嵌套异常 是 org.springframework.beans.factory.BeanCreationException: 无法自动装配字段:私有 com.primetech.module.common.service.UserService com.primetech.module.purchase.app.TestEntities.userService; 嵌套异常是 org.springframework.beans.factory.BeanCreationException: 使用名称创建 bean 时出错 'userService':注入自动装配 依赖失败;嵌套异常 是 org.springframework.beans.factory.BeanCreationException: 无法自动装配字段:受保护 com.primetech.core.parent.BaseDAO com.primetech.core.parent.BaseService.dao; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有独特的 bean 类型 [com.primetech.core.parent.BaseDAO] 是 定义:预期的单个匹配 bean 但发现2:[userDAO,approvalDAO] 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:574) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 在 org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:139) 在 org.springframework.context.support.ClassPathXmlApplicationContext。(ClassPathXmlApplicationContext.java:93) 在 com.primetech.module.purchase.app.TestEntities.main(TestEntities.java:81) 造成原因: org.springframework.beans.factory.BeanCreationException: 无法自动装配字段:私有 com.primetech.module.common.service.UserService com.primetech.module.purchase.app.TestEntities.userService; 嵌套异常是 org.springframework.beans.factory.BeanCreationException: 使用名称创建 bean 时出错 'userService':注入自动装配 依赖失败;嵌套异常 是 org.springframework.beans.factory.BeanCreationException: 无法自动装配字段:受保护 com.primetech.core.parent.BaseDAO com.primetech.core.parent.BaseService.dao; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有独特的 bean 类型 [com.primetech.core.parent.BaseDAO] 是 定义:预期的单个匹配 bean 但发现2:[userDAO,approvalDAO] 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:507) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:283) ... 13 更多 造成原因: org.springframework.beans.factory.BeanCreationException: 使用名称创建 bean 时出错 'userService':注入自动装配 依赖失败;嵌套异常 是 org.springframework.beans.factory.BeanCreationException: 无法自动装配字段:受保护 com.primetech.core.parent.BaseDAO com.primetech.core.parent.BaseService.dao; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有独特的 bean 类型 [com.primetech.core.parent.BaseDAO] 是 定义:预期的单个匹配 bean 但发现2:[userDAO,approvalDAO] 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:286) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1064) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:190) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:838) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:780) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:697) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) ... 15 更多 造成原因: org.springframework.beans.factory.BeanCreationException: 无法自动装配字段:受保护 com.primetech.core.parent.BaseDAO com.primetech.core.parent.BaseService.dao; 嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有独特的 bean 类型 [com.primetech.core.parent.BaseDAO] 是 定义:预期的单个匹配 bean 但发现2:[userDAO,approvalDAO] 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:507) 在 org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:283) ... 26 更多 原因: org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有独特的 bean 类型 [com.primetech.core.parent.BaseDAO] 是 定义:预期的单个匹配 bean 但发现2:[userDAO,approvalDAO] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:790) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:697) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) ... 28 更多

我尝试更改此部分,删除 @Repository 注释:

@Repository
public class ApprovalDAO extends BaseDAO<String, Approval> {
....
}

进入这个:

public class ApprovalDAO extends BaseDAO<String, Approval> {
....
}

事情运行没有错误,但是随后,批准 DAO 不再由 spring 管理,并且以后不能由 @Autowired 注入

关于如何解决这个问题有什么建议吗?


仅当 Spring 上下文中存在一个特定类型的实现 bean 时,自动装配才起作用。我假设使用通用 D extends BaseDao 会导致 Spring 尝试自动装配 BaseDao 实例而不是 UserDao 和 ApprovalDao 的情况。因为 UserDao 和 ApprovalDao 都实现了 BaseDao,所以 Spring 上下文包含 BaseDao 的多个实现,并且无法决定应该使用哪一个。

Spring 试图在堆栈跟踪中告诉你这一点

org.springframework.beans.factory.NoSuchBeanDefinitionException: 
__No unique bean of type__ [com.primetech.core.parent.BaseDAO] is defined:
expected single matching bean but found 2: [userDAO, approvalDAO]

您可以尝试通过使用实际的 dao 类型在具体服务中定义 dao 来测试这一点。

public abstract class BaseService<K, E extends BaseEntity, D extends BaseDAO<K, E>> {
   private final D dao;
   protected BaseService(D dao) {
      this.dao = dao;
   } 
}

public class UserService extends BaseService<K, User, UserDao<K, User>> {
   @Autowired
   public UserService(UserDao dao) {
     super(dao);
   }
}

我将继续为 UserDao 和 ApprovalDao 定义接口,以便依赖项位于接口而不是实现上。 daos 可能仍然有一个共同的超级接口,并且它们的实现可能基于 BaseDao 以避免不必要的重复。

在示例中,我在构造函数中定义了注入的 Dao,因为我假设应该在服务的整个生命周期中使用相同的 dao 实例,并且如果没有 dao 设置,服务就无法存在。在我看来,构造函数参数可以更好地传达该契约。此外,它可能会使该类更易于测试和维护。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试管理共享公共基类的多个类时出现 Spring 错误? 的相关文章

随机推荐

  • Xamarin Forms iOS 错误任务图标

    我认为有一个非常简单的问题 但我不太确定我是否做错了什么或者这是否是 Xamarin 问题 我有一个 iOS Xamarin Forms 项目 在该项目中 我无法设置按两次主页按钮时显示在 任务 视图中的 任务 图标 它始终显示 xamar
  • 对字符串不变性的困惑

    我有以下代码 public class StaticImplementer private static String str ABC public static void main String args str str XYZ 问题 这
  • C++ 类对象的引用和非引用返回 - 为什么输出相同?

    考虑以下代码 class Test public int data Test data 9 Test myfunction void print cout lt lt data lt
  • Symfony 应用程序 - 如何将计算字段添加到 Propel 对象?

    处理 Propel 对象的计算字段的最佳方式是什么 假设我有一个对象 Customer 它有一个相应的表 customers 并且每一列对应于我的对象的一个 属性 我想做的是 在视图 A 上使用它时 向我的对象添加一个计算属性 已完成订单数
  • 将 ncurses 窗口保持在前台

    我的应用程序正在使用 ncurses 并且有几个正在不断更新的窗口 在该应用程序中 当用户点击 q 时 我有一个充当 消息框 例如对话框 的窗口 询问他们是否要关闭 在其他窗口更新之前 这一切正常 此时 其他窗口将绘制在对话框上 使其 部分
  • 如何使用 id 获取 JavaFx 中的元素?

    我是 FXML 新手 我正在尝试使用以下命令为所有按钮单击创建一个处理程序switch 然而 为了做到这一点 我需要使用 和 id 获取元素 我已经尝试了以下方法 但由于某种原因 也许是因为我是在控制器类中而不是在主类中执行此操作 我收到了
  • DataOutputStream#writeBytes(String) 与 BufferedWriter#write(String)

    我想为我的报告创建一个 HTML 文件 报告中的内容可以通过使用创建BufferedWriter write String File f new File source htm BufferedWriter bw new BufferedW
  • 计算 Matplotlib 文本旋转[重复]

    这个问题在这里已经有答案了 我试图弄清楚如何在 matplotlib 中旋转文本以与图中的曲线对齐 但我还没有弄清楚什么转换可以为旋转文本提供正确的坐标系以匹配数据坐标中的特定斜率 这是绘制一条线并尝试沿其对齐一些文本的最小示例 Make
  • 如何设置AlertDialog中正负按钮的顺序?

    为什么我要这样做完全是另一个讨论 但我需要找出使我的所有警报对话框在右侧都有肯定按钮的最佳方法 请注意 在 3 0 及更低版本中 按钮通常显示为 确定 取消 而在 4 0 及更高版本中 按钮通常显示为 取消 确定 我想强制我的应用程序以最简
  • Xcode:在每次构建之前运行直接修改源代码的脚本

    我做了什么 我有一个脚本 阅读一些配置文件来生成源代码片段 找到相关的 Objective C 源文件并 将源代码的某些部分替换为步骤 1 中生成的代码 和一个 Makefile 它有一个特殊的时间戳文件作为 make 目标 配置文件作为目
  • Bash:循环直到命令退出状态等于 0

    我在本地计算机上安装了 netcat 并在端口 25565 上运行了一个服务 使用以下命令 nc 127 0 0 1 25565 lt dev null echo Netcat 检查端口是否打开 如果打开则返回 0 如果关闭则返回 1 我正
  • 如何理解 JavaScript 中的 isEqualNode()

    我试图理解 JavaScript 中的 isEqualNode 方法 显然根据 W3 学校提供的定义是这样的 isEqualNode 方法检查两个节点是否相等 如果满足以下所有条件 则两个节点相等 它们具有相同的节点类型 它们具有相同的no
  • HTML5 Websockets 可以在不使用服务器的情况下直接连接 2 个客户端(浏览器)吗? (P2P)[重复]

    这个问题在这里已经有答案了 使用 HTML5 Websockets 我可以直接在 2 个客户端 浏览器 之间打开套接字 假设我知道它们的 IP 地址并且不存在 NAT 遍历问题 我想将一些数据直接从一个浏览器发送到另一个浏览器 本质上是创建
  • 扩展内置集合,内置方法的问题

    我是 Scala 新手 所以请原谅我 如果这是一个愚蠢的问题 但这里是 想象一下 我希望创建一个包含附加方法的扩展 Map 类型 我可以看到几种方法来做到这一点 第一个是组合 class Path V val m Map V Int Def
  • Python multiprocessing.Pool:AttributeError

    我在一个类中有一个方法 需要在循环中完成大量工作 我想将工作分散到我的所有核心上 我写了下面的代码 如果我使用正常的话 它可以工作map 但与pool map 返回错误 import multiprocessing pool multipr
  • IPython笔记本:如何重新加载特定Python文件中的所有模块?

    我在一个文件中定义了许多模块 并添加from myFile import 到我的 ipython 笔记本的第一行 以便我可以将它用作该笔记本中其他部分的依赖项 目前我的工作流程是 modify myFile 重启Ipython内核 重新运行
  • OWL 限制 - 定义仅包含具有特定属性值的属性的类

    我目前正在玩 OWL 尤其是有限制的情况 我正在尝试创建一个执行以下操作的查询 假设我有一个类 Cinema 它具有属性 movies 包含 Movie 类型的对象 Movie 类包含一个名为 genre 的属性 现在我想创建一个 Acti
  • 如何自动设置跨度计数和图标大小

    我正在使用回收器视图和卡片视图来显示应用程序中的图标 我无法弄清楚如何调整应用程序图标的大小并根据屏幕尺寸自动增加 减少跨度计数 这是我正在做的显示它的操作 并且花费计数固定为 3 RecyclerView mrv RecyclerView
  • 使用 ASCII/拉丁字符集是否可以加快数据库速度?

    看起来 对大多数字段使用 ASCII 字符集 然后仅对需要它的字段指定 utf8 可以将数据库必须执行的 I O 量减少 100 有人知道这是真的吗 更新 以上并不是我的问题 我应该说 使用拉丁语作为默认字符集 然后只为需要它的字段指定 u
  • 尝试管理共享公共基类的多个类时出现 Spring 错误?

    我目前使用 Spring 3 0 x 我想知道这些结构有什么问题 我想管理子类而不是父类 我有 2 个子 DAO 扩展了 BaseDAO public abstract class BaseDAO