【发布时间】:2013-03-07 13:13:39
【问题描述】:
我有一颗豆子:
public class StatusPollingFilter extends AbstractDiscovery implements UserTester
定义为:
<bean
id="statusPollingFilter"
class="com.xxxxx.yyyyyyy.zzz.StatusPollingFilter">
<property
name="evoDao"
ref="evoDaoFacade">
</property>
加载正常,如日志所示:
2013-03-07 11:30:14,703 INFO DefaultListableBeanFactory [RunJSPModule] - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@14966cc: defining beans [org.springframework.aop.config.internalAutoProxyCreator,org.springframework.transaction.config.internalTransactionAdvisor,tilesConfigurer,viewResolver,urlMapping,discovery,statu
sPollingFilter,
当我尝试将其用作:
TopoObject topoobj = evoDao.getTopoObjectDao().findById(topoId);
evoDao 是执行以下定义的工作的主要人员: 类 AbstractDiscovery 如:
//Reference to the DAO facade, for accessing the database via hibernate.
protected EvoTAMDAOFacade evoDao;
问题? 因为我扩展了 AbstractDiscovery,所以我认为我可以访问 evoDao 并像往常一样使用它来获取我的 Dao,但似乎不是——我哪里出错了? 为什么找不到道?
EvoTAMDAOFacade 被注入到 AbstractDiscovery 中:
/**
* DI method for accessing the DAO facade for accessing the
* database via hibernate.
* @param dao
*/
public void setEvoDao(EvoTAMDAOFacade dao)
{
this.evoDao = dao;
}
getTopoObjectDao() 在注入的 EvoTAMDAOFacade 中定义为:
public TopoObjectDAO getTopoObjectDao()
{
return this.topoObjectDao;
}
AbstractDiscovery 定义为:
public abstract class AbstractDiscovery implements Discovery
例外是:
[07 Mar 2013 11:42:24:353] POLL: Exception while getting obj during status update java.lang.NullPointerException 162.109.37.114 at:
java.lang.NullPointerException
另一个问题? statusPollFilter 在多个对象的调度程序中作为线程运行 - 我实际上不确定我是否应该将其定义为单例 bean,但如果我要如何访问 Dao没有?
提前感谢您的帮助。
【问题讨论】:
-
TopoObjectDAO是否也注入到EvoTAMDAOFacade中?为 null 也可能导致您的问题。 -
它被注入了,但这就是我所期望的——显然我在这里犯了一些男生类型错误,但我看不到它。我希望注入的 TopoObjectDAO 将通过 spring 实例化,最初为 null,但通过 .findById(topoId); 填充。方法。或者我在这里错过了一些 pt。我认为它是一个 DAO 并通过它的 TopoObject.hbm.xml 连接到休眠的事实这将通过休眠处理,我会得到一个填充的对象,还是我需要先从 id 以某种方式创建它?感谢您的帮助。
-
您是否尝试过在 set 方法中设置断点,确保在应用程序加载时调用它们?
-
是的,我已经这样做了,当应用程序加载时,EvoTAMDAOFacade 和 TopoObjectDAO 的两个设置器都会被调用。奇怪的是,具有相同 DI 对象的相同代码在其他地方以完全相同的方式调用并且工作正常。这就是为什么我要问第二个问题,即轮询器通过调度程序线程运行并实现第 3 方 api 接口,我不确定我是否应该为 DI 创建一个单例 spring bean。尽管如此,它确实被创建了,spring 并没有抱怨 poller bean,我将 EvoTAMDAOFacade 注入到 poller bean 中,期望访问我的 DAO 2
-
实际上当我在 StatusPollingFilter ' private EvoTAMDAOFacade evoDao 中执行此操作时; public void setEvoDao(EvoTAMDAOFacade dao) { this.evoDao = dao; }' 里面没有注入 dao。我调试它显示没有加载。但是创建了spring bean StatusPollingFilter。
标签: spring hibernate jakarta-ee design-patterns spring-mvc