无法使用注释和基于Java的配置在Spring MVC中建立数据库连接

时间:2018-09-01 15:56:06

标签: java spring spring-mvc spring-jdbc tomcat-dbcp

我正在创建一个Spring MVC应用程序,该应用程序与MySQL数据库建立了数据库连接。我已经使用过基于Java的配置。但是我不知道为什么DataSoruce即将到来null

有人可以告诉我我在做什么错吗?

我在其中配置前端控制器的类。

public class FontControllerConfig extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {

        return new Class[] { WebMvcConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {

        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

我必须启用Spring MVC功能的类。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "controller")
public class WebMvcConfig {

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver vr = new InternalResourceViewResolver();

        // set location of views.
        vr.setPrefix("/");

        // set the extension of views.
        vr.setSuffix(".jsp");

        return vr;
    }

}

创建数据库连接

public class DbManager {

    @Bean
    public BasicDataSource getDataSource() {
        BasicDataSource bds = new BasicDataSource();
        bds.setDriverClassName("com.mysql.jdbc.Driver");
        bds.setUrl("jdbc:mysql://localhost:3306/local");
        bds.setUsername("root");
        bds.setPassword("");

        return bds;
    }

    @Autowired
    private DataSource ds;


    public void setDs(DataSource ds) {
        this.ds = ds;
    }

    public Connection conn() throws SQLException {

        Connection conn = ds.getConnection();

        return conn;

    }

}

以及处理用户请求以检查连接是否建立的最终控制器类。

@Controller
public class MyController {

    @RequestMapping("/check")
    public ModelAndView greet() throws SQLException {

        DbManager dbMan = new DbManager();

        if (dbMan.conn() != null) {
            return new ModelAndView("welcome", "msg", "SUCCESS");
        } else {
            return new ModelAndView("welcome", "msg", "FAIL");
        }

    }

}

预先感谢:)

2 个答案:

答案 0 :(得分:0)

当您自己实例化DbManager时,spring无法拦截并为您自动布线。因此,数据源将为空。

要解决此问题:

  • 首先在DbManager中添加@Configuration批注-然后Spring将自动将其识别为bean工厂并为您实例化。 (这样做时,您可能首先会看到一个错误,因为DbManager尝试自动装配它自己创建的bean。只需从类和对数据源的引用中完全删除@Autowired。
  • 让Spring自动将数据源连接到您的控制器中(例如通过构造函数或字段注入)。

希望这会有所帮助

Matthias

答案 1 :(得分:0)

可以看到的错误是您错过了DbManager.class上的@Configuration批注

我要指出的另一件事是“ setDs”方法,您不需要它,因为这基本上是@Autowired所做的,这也是您的下一个错误,您必须从spring获取DbManager的实例使用@Autowired。

@Autowired
private DataSource dbMan;

 @RequestMapping("/check")
public ModelAndView greet() throws SQLException {

    //DbManager dbMan = new DbManager();

    if (dbMan.conn() != null) {
        return new ModelAndView("welcome", "msg", "SUCCESS");
    } else {
        return new ModelAndView("welcome", "msg", "FAIL");
    }

}

如果仍然没有建立连接,请确保。

  1. DbManager.class是否在@ComponentScan注释中给出的包中。