0

我有一个豆子:

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

另一个Q?statusPollFilter 在多个对象的调度程序中作为线程运行 - 我实际上不确定我是否应该将其定义为单例 bean,但如果我不这样做,我如何访问 Dao?

在此先感谢您的帮助。

4

1 回答 1

0

阅读更多 - 我遇到了ans。因为 StatusPollingFilter 对象在调度程序的控制下(我知道调度程序与它有关),所以它不知道 spring bean,这就是为什么我在尝试注入 bean 时总是得到 null 的原因。

我创建了一个类:

 ApplicationContextProvider implements ApplicationContextAware

添加静态访问

private static ApplicationContext   appContext;

为它做了一个二传手:

public void setApplicationContext(ApplicationContext context)
{
    appContext = context;
}

并添加

public static Object getBean(String beanName) throws BeansException
{
    return appContext.getBean(beanName);
}

在代码中用作:

EvoTAMDAOFacade evoDao = (EvoTAMDAOFacade) ApplicationContextProvider.getBean("evoDaoFacade");

我现在可以访问外观 bean 和所有注入外观的 bean。我仍然有休眠会话的问题,但那是由于其他一些问题。

pt 这里是我无法访问 bean,因为它无法控制 spring 容器,所以我需要以某种方式获取它,可能可以通过工厂方法完成它,但是当有更简单的方法时为什么要乱来。感谢任何可能发布或试图理解我的问题的人的帮助。

于 2013-03-13T21:55:21.140 回答