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

Unable to established database connection in Spring MVC using annotation and java based configuration

我正在创建一个 Spring MVC 应用程序,它与 MySQL 数据库建立了数据库连接。我使用了基于 java 的配置。但是我不知道为什么DataSoruce要来null

有人能告诉我哪里做错了吗?

我配置前端控制器的 class。

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 功能的 class。

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

    }

}

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

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

    }

}

提前致谢:)

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

解决这个问题:

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

希望对您有所帮助

马蒂亚斯

可以看到的错误是您在 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 注释中给出的包中。