Spring:将DAO自动装入实用程序类不能正常工作

时间:2014-04-16 15:40:00

标签: java spring jpa dao autowired

我有一个注释驱动的spring mvc项目,它是在JBoss web mvc示例之后模板化的。 (Spring,Hibernate,JPA 2.0)

我有一个实用程序包,我想为显而易见的实用程序函数添加可重用的类。 具体来说,我有一个LogonUtilities类,我想查询数据库以获取信息。

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

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

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

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

我认为这就是我需要做的全部。

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

@Service    
public class LogonUtilities {

    @Autowired private KeywordDao keywordDao; 

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

提前致谢。

*在我的代码中,它实际上被称为&#34; TrainingKeyword&#34;不是&#34;关键字&#34; 这是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");

3 个答案:

答案 0 :(得分:1)

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

基本上我已经尝试了所有有效的东西 - 但从来没有一起。我不断对我的代码进行编辑,试图让它工作,并且总是丢失一些东西或者一些不好的东西。对于有类似问题的人,这里是步骤

在我的LogonFilter中,我添加了

 @Autowired private LogonUtilities lu

在我的LogonUtilites课程中,我添加了

@Autowired private TrainingKeywordDao keywordDao;

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

感谢所有帮助过的人 - 你的想法一直让我重新思考我在做什么。

答案 1 :(得分:0)

您正在尝试@Autowired private KeywordDao keywordDao;,但未收到任何自动装配错误。但@Autowired默认为@Autowired(required=true),这意味着默认情况下这些依赖项是强制性的,如果不满足则抛出错误。

没有收到自动装配错误,因此得出的结论是,似乎根本没有扫描此类的自动装配。

如果它会出现错误。试着看看为什么班级没有自动装配,这里有一些常见的原因:

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

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

答案 2 :(得分:0)

确保base-package是来自root用户的服务的完全限定路径,并确保KeywordDao使用@Repository进行注释。