Spring JDBCTemplate。空指针异常

时间:2018-10-08 16:04:29

标签: spring spring-mvc datasource jdbctemplate

我正试图从头开始建立一个SpringMVC网站,但是我走到了穷途末路。

我正在使用自动装配实例化具有数据源的JdbcTemplate,但是不知何故我得到了Null指针异常。感谢您的帮助。

下一个是我的AppConfig:

@Configuration
@ComponentScan
public class AppConfig {
    @Bean
    public DriverManagerDataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/onlinelibrary");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
    /*Deleted this code, still doesn't work
    @Bean
    public Book Book() {
        return new Book();
    }
    */
}

“我的书”类如下:

@Component
public class Book {
    private JdbcTemplate jdbcTemplate;
    private String title;
    private String author;
    private String isbn;

    public Book() {

    }

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

    public ModelMap getBooks() {
        ModelMap model = new ModelMap();
        String sql = "SELECT * FROM Books";
        model.put("data", jdbcTemplate.queryForList(sql));
        return model;
    }
}

这是臭名昭著的NullPointer异常:NullPointerException

任何帮助将不胜感激。我可能忘了做某事,但我自己无法解决,而且我在StackOverflow上也找不到任何对我有帮助的东西(尽管到目前为止我已经阅读了许多文章)。

更新更多数据:

我的项目结构是下一个:

Project structure

我正在此控制器中使用Book对象:

@Controller
public class BookController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String getBookData(Book book, ModelMap model) {
        model.put("data", book.getBooks());
        return "BookView";
    }
}

1 个答案:

答案 0 :(得分:0)

当您在类上拥有@Component时,这意味着只要组件扫描程序正在扫描 Book 类,Spring就会为您创建一个Bean。您不需要

@Bean
public Book Book() {
    return new Book();
}

由于此bean没有注入jdbcTemplate而抛出NullPointerException。

更新:

您对弹簧注射的理解是错误的。我已经更新了应该工作的控制器代码。

@Controller
public class BookController {

    @Autowired
    Book book;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String getBookData(ModelMap model) {
        model.put("data", book.getBooks());
        return "BookView";
    }
}

更新:组件扫描

@ComponentScan(basePackages = "models")
public class AppConfig {