首页 > 解决方案 > 如何在springboot中自动装配jdbcTemplate?

问题描述

尝试使用带有 SpringBoot 2.1.4.RELEASE 的 JdbcTemplate 访问 Oracle 数据库,但出现空指针异常

根据 SpringBoot 文档在下面尝试过,我仍然遇到空指针异常。

@Component
public class DataAccessObject {

    private final JdbcTemplate jdbcTemplate;

    @Autowired
    public DataAccessObject(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    // ...

}

getCircleCount() 中抛出空指针异常

@Component
public class DataAccessObject {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public void getCircleCount() {
        int count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM CIRCLE", Integer.class);
        System.out.println(count);
    }
}

而我在这里得到圈数

@SpringBootApplication
@ComponentScan("org.vinodh.camunda")
public class DatabaseDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DatabaseDemoApplication.class, args);
        DataAccessObject dao = new DataAccessObject();
        dao.getCircleCount();
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext context) {
        JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
        int count = jdbcTemplate.queryForObject("SELECT COUNT(*) FROM CIRCLE", Integer.class);
        System.out.println(count);
        return null;
    }

}

实际上我不应该在这两个地方都得到计数吗?

标签: javaspring-bootjdbctemplate

解决方案


在 main 方法中,您自己实例化 DataAccessObject。对象创建中不涉及 Spring,因此自动装配不起作用。

public static void main(String[] args) {
    SpringApplication.run(DatabaseDemoApplication.class, args);
    DataAccessObject dao = new DataAccessObject();
    dao.getCircleCount();
}

请尝试以下代码:

public static void main(String[] args) {
    ApplicationContext context = SpringApplication.run(DatabaseDemoApplication.class, args);
    DataAccessObject dao = context.getBean(DataAccessObject.class);
    dao.getCircleCount();
}

推荐阅读