【问题标题】:null pointer exception whilst using spring - although bean loaded correctly使用弹簧时出现空指针异常-尽管正确加载了bean
【发布时间】: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


【解决方案1】:

阅读更多 - 我遇到了答案。 因为 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。 我仍然有休眠会话的问题,但这可能是由于其他一些问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 2014-11-19
    • 2020-06-23
    • 1970-01-01
    • 2015-04-27
    • 2020-03-21
    相关资源
    最近更新 更多