Spring Framework自动装配空指针异常

时间:2014-08-14 00:47:30

标签: java spring jdbc dependency-injection

我正在学习Spring,而且我在尝试建立一个相对基本的Spring项目时遇到了一些问题。我正在创建一个简单地从数据库中读取的应用程序,但是我遇到了自动装配或者缺少自动装配的问题。我的GetCustomerEvent类在GetCustomers()方法中抛出空指针异常,因为CustomerService变量尚未初始化。有人能指出我在正确的方向吗?

Application.class

package org.ben.test.main;
@Configuration
@ComponentScan(basePackages={"org.ben.test.persistence", "org.ben.test.main"})
public class Application {

    @Bean
    public CustomerService customerService() {
        return new CustomerService();
    }

    @Bean 
    public DataSource getDataSource() {
        DriverManagerDataSource dmds = new DriverManagerDataSource();
        dmds.setDriverClassName("org.postgresql.Driver");
        dmds.setUrl("jdbc:postgresql://localhost:5432/Customers");
        dmds.setUsername("postgres");
        dmds.setPassword("postgres");
        return dmds;

    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        DataSource ds = getDataSource();
        JdbcTemplate jdbc = new JdbcTemplate(ds);
        return jdbc;
    }

    public static void main(String[] args) {
        GetCustomerEvent ev = new GetCustomerEvent();
        ev.GetCustomers();
    }
}

CustomerService.class

package org.ben.test.persistence;

@Component
public class CustomerService {

    @Autowired JdbcTemplate jdbcTemplate;

    public CustomerService() {

    }

    public void getCustomers() {
        jdbcTemplate.query("SELECT * FROM Customers", new RowMapper() {
            @Override
            public Object mapRow(ResultSet arg0, int arg1) throws SQLException {
                System.out.println(arg0.getString("firstName"));
                return null;
            }
        });
    }

}

GetCustomerEvent.class

package org.ben.test.persistence;


@Component
public class GetCustomerEvent {

    @Autowired 
    CustomerService customerService;

    public GetCustomerEvent() {

    }

    public void GetCustomers() {
        customerService.getCustomers();
    }
}

3 个答案:

答案 0 :(得分:2)

问题在于以下行

GetCustomerEvent ev = new GetCustomerEvent();

您使用" new"手动创建了实例。 Spring对这个对象没有任何想法。有关详细信息,请参阅Why is my Spring @Autowired field null?

答案 1 :(得分:2)

您没有初始化Spring容器。

您需要create your context才能使其正常工作。

答案 2 :(得分:0)

无论您使用的是基于xml还是基于注释的配置,都需要创建应用程序上下文。 如果您的应用程序是Web应用程序,请参阅此文章Loading context in Spring using web.xml以加载应用程序上下文

获得应用程序后,您可以使用context.getBean()方法获取bean

此外,spring容器不管理您使用new运算符创建的对象。在您的示例中,您需要自动装配GetCustomerEvent bean

@Autowired GetCustomerEvent getCustomerEvent;
//and call
getCustomerEvent.getCustomers();