无法使用注释和基于 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");
}
}
如果您的连接仍然没有崩溃,请确认。
- DbManager.class是否在您在@ComponentScan 注释中给出的包中。
我正在创建一个 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");
}
}
如果您的连接仍然没有崩溃,请确认。
- DbManager.class是否在您在@ComponentScan 注释中给出的包中。