在spring

时间:2016-01-05 06:04:38

标签: java spring nullpointerexception

我是Spring的新手,正在从事需要从数据库中获取数据的项目。我正在使用tomcat服务器并使用JNDI DB连接池。下面是我的代码和Spring配置。我收到了NullPointerException,因为jdbcTemplatenull

public class AppConfig 
{
@Autowired
private JdbcTemplate jdbcTemplate;
private static AppConfig config=null;
private HashMap<String,  String> dbAppParameterValuesCacheMap;
public AppConfig()
{
    cacheConfig();

}

public boolean cacheConfig()
{
    dbAppParameterValuesCacheMap = null;
    List<Map<String, Object>> appConfigMapList=null;
    String parameterType="PP_APP_CONFIG";
    try
    {
        appConfigMapList= jdbcTemplate
            .queryForList("SELECT  Parameter_Value, Parameter_Name FROM PP_Application_Parameter where PARAMETER_TYPE='"+parameterType+"'");
    }
    catch(NullPointerException ex)
    {
        System.out.println("here");
        ex.printStackTrace();
    }
    if (dbAppParameterValuesCacheMap == null)
        dbAppParameterValuesCacheMap = new HashMap<String,String>();
    for(Map<String, Object> configMap:appConfigMapList)
    {
            dbAppParameterValuesCacheMap.put((String)configMap.get("Parameter_Name"), (String)configMap.get("Parameter_Value"));
    }

    return true;
}
}

我的Spring配置文件包含:

<bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/PP_DATASOURCE" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" lazy-init="false">
    <property name="dataSource" ref="dbDataSource"></property>
</bean>
<bean id="config" class="AppConfig" scope="singleton">
</bean>

JNDI已成功创建。我试图执行行

时得到NullPointerException
appConfigMapList= jdbcTemplate
            .queryForList("SELECT  Parameter_Value, Parameter_Name FROM PP_Application_Parameter where PARAMETER_TYPE='"+parameterType+"'");

2 个答案:

答案 0 :(得分:1)

根据Autowired的文档,在构造bean之后进行注入。

  

在构造bean之后立即注入字段,然后调用任何配置方法。这样的配置字段不必是公开的。

由于您的代码尝试从构造函数引用jdbcTemplate,因此尚未注入,因此它是null

如果您的目标是在保证自动连接的依赖关系到位后运行一些额外的初始化代码,那么一种方法是使用PostContruct注释与构造函数不同的方法。

答案 1 :(得分:0)

考虑这一变化:

public AppConfig()
{
}

@PostConstruct
public boolean cacheConfig()
{

这将把对jdbcTemplate的访问权限移到之后由Spring完成自动配对,同时保持你的语义(在对象构建之后立即运行cacheConfig)。

@Autowired字段在构造函数运行时为空。