0

我正在创建一个与 MySQL 数据库建立数据库连接的 Spring MVC 应用程序。我使用了基于 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");
        }

    }

}

提前致谢 :)

4

2 回答 2

0

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

要解决这个问题:

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

希望这可以帮助

马蒂亚斯

于 2018-09-02T07:59:38.547 回答
0

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

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

@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 注释中提供的包中。
于 2018-09-02T14:50:12.010 回答