【问题标题】:Spring: autowiring DAO into a utility class not workingSpring:将DAO自动装配到实用程序类中不起作用
【发布时间】:2014-04-16 15:40:00
【问题描述】:

我有一个在 JBoss web mvc 示例之后模板化的注释驱动的 spring mvc 项目。 (春天,休眠,JPA 2.0)

我有一个实用程序包,我想在其中放置可重用的类以用于明显的实用程序功能。 具体来说,我有一个 LogonUtilities 类,我想在其中查询数据库以获取信息。

我在那里自动装配我的 DAO,但是当我调试时,DAO 总是为 null 并且由于该异常而失败。

我已经阅读并尝试了很多东西 - 我知道我可能已经找到了解决方案 - 但错过了一些东西并继续尝试其他东西。我可能没有在谷歌上搜索正确的术语,因为注释对我来说是新的。 (我使用 spring 和 hibernate 多年 - 但使用 xml)

我已将此添加到我的 applicationContext.xml 中

<context:component-scan base-package="util"/>

我认为这是我需要做的所有事情。

这是我目前在我的 LogonUtility 类中的内容 - 但它不起作用,keywordDao 始终为空。如果我将 DAO 连接到 applicationContext 中的 LogonUtility bean(旧方式),我想我可能可以让它工作,但我认为有更好的方法来使用注释。

@Service    
public class LogonUtilities {

    @Autowired private KeywordDao keywordDao; 

我的应用程序不是全新的,此时我可能有十个工作控制器和十几个工作 DAO,包括一个关键字控制器和已经执行 CRUD 操作的 DAO,所以我不认为我的设置与这些东西有关是不正确的。 我只是想重用一些从数据库中提取的代码。

提前致谢。

*在我的代码中它实际上被称为“TrainingKeyword”而不是“Keyword” 这是 nullPointer 错误,因为 DAO 为空

10:52:07,673 ERROR [io.undertow.request] (default task-1) UT005023: Exception handling request to /Training/Home: java.lang.NullPointerException

    at util.LogonUtilities.trainingOffices(LogonUtilities.java:59) [classes:]
    at filter.LogonFilter.doFilter(LogonFilter.java:100) [classes:]
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) [spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE]

这是发生错误的代码

//Set TrainingOffices
List<TrainingKeyword> kList1 = keywordDao.getAllTrainingKeywordsByName("Level 200 Training Offices");

【问题讨论】:

  • 告诉我们你在哪里使用LogonUtilities bean
  • 我的 applicationContect 中 xml 的语义不是问题。 ("/") 在结束标记之前。那是我试图让 xml 在问题中正确显示。反斜杠不在代码中。
  • 什么?不,请告诉我们您在代码中使用LogonUtilities 的位置。向我们展示 NPE 的堆栈跟踪。
  • 我使用 LogonUtilities 的一个地方在我的登录过滤器中,另一个在控制器中 - 我刚刚发现它可能也没有正确设置。我试图发布控制器代码,但它不会让我。基本上我只是在做一个 Autowired LogonUtilities lu;
  • 发布代码时,选择所有代码并单击{} 按钮。发布堆栈跟踪,我们可以从那里开始。

标签: java spring jpa dao autowired


【解决方案1】:

我通过听取您的想法并在这个问题的帮助下解决了我的问题。 JPA is not Autowiring

基本上我已经尝试了所有可行的方法 - 但从来没有一起尝试过。我不断地对我的代码进行编辑以使其正常工作,并且总是缺少某些东西或某些东西不好。对于任何有类似问题的人,这里是步骤

在我添加的 LogonFilter 中

 @Autowired private LogonUtilities lu

在我的 LogonUtilites 类中我添加了

@Autowired private TrainingKeywordDao keywordDao;

没有必要将 LogonUtility bean 添加到我的 applicationContext - 我把它拿出来,它仍然有效。

感谢所有提供帮助的人 - 您的想法不断让我重新思考我在做什么。

【讨论】:

    【解决方案2】:

    您正在尝试执行@Autowired private KeywordDao keywordDao;,但您没有收到任何自动装配错误。但是@Autowired默认是@Autowired(required=true),这意味着这些依赖默认是强制的,如果不满足就会抛出错误。

    没有收到自动装配错误,因此结论是似乎根本没有扫描这个类以进行自动装配。

    如果是这样,则会引发错误。试着看看为什么这个类没有被自动装配,这里有一些常见的原因:

    • 放置类的包没有被扫描,类包的名称是util还是子包?

    • 扫描是在错误的 spring 上下文中进行的。大多数 Spring 应用程序有两个上下文,一个根上下文和一个 servlet 调度程序上下文。通过将此配置行从一个 XML 文件复制到另一个,尝试将组件扫描 &lt;context:component-scan base-package="util"/&gt; 从一个上下文移动到另一个上下文。

    【讨论】:

    • 如果我理解正确,您认为 util 包没有被正确扫描。作为测试,我将 LoginFilter 移动到另一个包(repo),该包的设置方式与 util 完全相同(context:component-scan ...)。我的 repo 包包含我所有的 DaoImplementations,它们与 @Autowired 一起工作得很好。测试失败,运行时 LoginFilter 类中的 KeywordDao 仍然为空。
    【解决方案3】:

    确保base-package 是从根目录开始的服务的完全限定路径,并确保KeywordDao 带有@Repository 注释。

    【讨论】:

    • 我认为这不是问题,因为我设置了另外两个运行良好的包,并且我的 DAO 使用 @Repository 进行了注释
    • LogonUtilities也是使用spring注入实例化的,所有的父对象也是如此,而不是在任何地方使用new操作符?
    • 我没有使用 new 运算符来实例化 LogonUtilities。我不确定我是否完全理解弹簧注射的含义。我是注释的新手。以旧的方式,我会为每个 DAO 创建一个服务 bean,然后在 servlet 中创建一个指向我的控制器的 bean,其中包含对我需要的任何服务 bean 的引用(属性)。在这个新世界中,我没有 servlet 代码并使用 @RequestMapping 将请求映射到控制器。我怀疑你是在正确的道路上
    • 我尝试添加 但我仍然认为我需要以某种方式注入 DAO。您能否详细说明所有步骤?我怀疑我已经做过了,但从来没有在一起。
    • 我可以建议您查看 projects.spring.io/spring-framework 上的示例,它们非常简单,并展示了如何设置基本的 Spring 应用程序。此外,如果您使用 Spring 4,请摆脱任何 XML 并使用基于注释的配置。您还可以在示例中看到这一点:创建一个配置类,使用 @Configuration @ComponentScan 对其进行注释。这样,您的 LogonUtils 应该会自动自动装配,因为 spring 会检测到 @Repository 注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2014-09-01
    • 2017-01-19
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多