繁体   English   中英

Spring Framework自动连线的空指针异常

[英]Spring Framework Autowired Null Pointer Exception

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

应用程序类

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();
    }
}

问题在于下面的线

GetCustomerEvent ev = new GetCustomerEvent();

您使用“新”手动创建了实例。 Spring没有关于此对象的想法。 请参阅为什么我的Spring @Autowired字段为空? 有关详细信息。

您没有初始化Spring容器。

您需要创建上下文以使其起作用。

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

一旦有了应用程序,就可以使用context.getBean()方法获取bean。

而且,spring容器不管理使用new运算符创建的对象。 在您的示例中,您需要自动连接GetCustomerEvent bean

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM