Spring JDBCTemplate。空指针异常

Spring JDBCTemplate. Null pointer exception

我正在尝试从头开始建立一个 SpringMVC 网站,但我遇到了死胡同。

我正在使用自动装配将 JdbcTemplate 与数据源实例化,但不知何故我得到了空指针异常。非常感谢你的帮助。

我的 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();
    }
    */
}

我的书class如下:

@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;
    }
}

这就是臭名昭著的空指针异常:

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

更新更多数据:

我的项目结构是下一个:

我在这个控制器中使用 Book 对象:

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

当您在 class 上有 @Component 时,这意味着 Spring 将为您创建一个 Bean,前提是您的组件扫描器正在扫描 Book class。你不需要

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

这是因为这个没有注入 jdbcTemplate 的 bean 抛出 NullPointerException。

更新:

你对spring注入的理解是错误的。我已经更新了应该工作的控制器代码。

@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 {