使用spring时空指针异常 - 尽管bean正确加载

时间:2013-03-07 13:13:39

标签: spring hibernate java-ee design-patterns spring-mvc

我有一个豆子:

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是做这项工作的主要人物,定义如下: class 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不?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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到外观。 我仍然有一个hibernate会话的问题,但由于其他一些问题,这可能是问题。

这里是我无法访问bean,因为它不能控制弹簧容器,所以我需要以某种方式得到它,可能可以通过工厂方法完成它但是为什么有更简单的方法。 感谢任何可能已发布或试图了解我的问题的人的帮助。