Spring-Boot-jdbcTemplate 对象未初始化
Spring-Boot-jdbcTemplate object not initialized
我是 Spring Boot/MVC 的初学者。我一直在尝试构建一个非常基本的示例来查询包含 doctors.However 主数据的 table 我反复得到 "java.lang.NullPointerException"。很可能是因为 jdbcTemplate 对象没有得到初始化。
其他一些用户也遇到了这个问题,但是在他们的情况下,在包含 starter-jdbc jar 或删除使用新运算符创建 jdbctemplate object.I 之后问题已解决在我的代码中考虑了这些建议。对此事的任何帮助都是 appreciated.My 代码片段如下:
1. application.properties :
server.port=8181
spring.datasource.url = jdbc:mysql://localhost:3306/my_sample_schema
spring.datasource.username = qwerty
spring.datasource.password = qwerty
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.driverClassName=com.mysql.jdbc.Driver
debug=true
2。 Test123Application.java
package com.example;
....all imports...
@SpringBootApplication
public class Test123Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Test123Application.class, args);
}
}
3.Testcontroller.java
package com.example.controller;
....all imports...
@Controller
public class TestController {
@RequestMapping(value = "/")
public String demofunction(){
return "dummytemplate";
}
@RequestMapping("/default")
public String demofunction2(Model model){
Docrepo docrepo = new Docrepoimpl();
List<Docmaster> listContact = docrepo.list();
model.addAttribute("listContact", listContact);
return "dummytemplate2";
}
}
4. Docrepoimpl.java
package com.example.repository;
----all imports---
@Configuration
@Repository
public class Docrepoimpl implements Docrepo{
@Autowired
private JdbcTemplate jdbcTemplate;
public void adddoctor(Docmaster doc){
String sql = "INSERT INTO docmastertable (docid,name,yoe,speciality,degree,college,hospital,regno)"
+ " VALUES (?,?,?,?,?,?,?,?)";
jdbcTemplate.update(sql, doc.getdocid(), doc.getname(),doc.getyoe(), doc.getspeciality(),doc.getdegree(),doc.getcollege(),doc.gethospital(),doc.getregno());
}
public List <Docmaster> list(){
String sql = "SELECT * FROM docmastertable";
if(jdbcTemplate != null)
System.out.println("jdbc seems ok...");
else
System.out.println("jdbc is null...");
List<Docmaster> listContact = jdbcTemplate.query(sql, new RowMapper<Docmaster>() {
@Override
public Docmaster mapRow(ResultSet rs, int rowNum) throws SQLException {
Docmaster doc = new Docmaster();
doc.setdocid(rs.getString("docid"));
doc.setname(rs.getString("name"));
doc.setyoe(rs.getInt("yoe"));
doc.setspeciality(rs.getString("speciality"));
doc.setdegree(rs.getString("degree"));
doc.setcollege(rs.getString("college"));
doc.sethospital(rs.getString("hospital"));
doc.setregno(rs.getString("regno"));
return doc;
}
});
return listContact;
}
}
错误转储:
java.lang.NullPointerException: 空
在 com.example.repository.Docrepoimpl.list(Docrepoimpl.java:52) ~[类/:na]
在 com.example.controller.TestController.demofunction2(TestController.java:43) ~[类/:na]
在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0_40]
在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)~[na:1.8.0_40]
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(来源不明)~[na:1.8.0_40]
在 java.lang.reflect.Method.invoke(来源不明)~[na:1.8.0_40]
...
实际上,您是直接在控制器 class 中使用 new
语句创建存储库。我还建议通过创建一个本地成员并用 @Autowired
注释将您的 Repo 注入到您的控制器 class 中。如果您不想遵循这种方式,您也可以向 Context
请求 return 一个现成的 bean。
当您尝试访问不受 Spring 引导框架也就是 Spring 引导容器管理的 Spring class 时,它总是会发生。
通过以下行,您可以获得任何 @Autowired 不起作用的 spring 引导 class。
这是一个class,我曾经在没有@Autowired 的情况下访问 JdbcTemplate。
public class MysqlServiceJava {
// You don't need @Autowired
JdbcTemplate jdbcTemplate;
public MysqlServiceJava() {
// Get JdbcTemplate through Context container AKA !! THE MAGIC !!
jdbcTemplate = ApplicationContextHolder.getContext().getBean(JdbcTemplate.class);
}
public List<Integer> findAllEasyId(){
List<Integer> Ids = new ArrayList<>();
String sql = "SELECT id FROM master_table";
jdbcTemplate.query(
sql, new Object[] {},
(rs, rowNum) -> new MasterTable(rs.getInt("id"))
).forEach(
masterTable ->
Ids.add(masterTable.getId()) // add Id to Ids List array
);
return Ids;
}
}
class MasterTable {
private Integer id;
public MasterTable(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
@Override
public String toString() {
return "MasterTable{" +
"id=" + id +
'}';
}
public void setId(Integer id) {
this.id = id;
}
}
喜欢就点个赞吧=)
我是 Spring Boot/MVC 的初学者。我一直在尝试构建一个非常基本的示例来查询包含 doctors.However 主数据的 table 我反复得到 "java.lang.NullPointerException"。很可能是因为 jdbcTemplate 对象没有得到初始化。 其他一些用户也遇到了这个问题,但是在他们的情况下,在包含 starter-jdbc jar 或删除使用新运算符创建 jdbctemplate object.I 之后问题已解决在我的代码中考虑了这些建议。对此事的任何帮助都是 appreciated.My 代码片段如下:
1. application.properties :
server.port=8181
spring.datasource.url = jdbc:mysql://localhost:3306/my_sample_schema
spring.datasource.username = qwerty
spring.datasource.password = qwerty
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.driverClassName=com.mysql.jdbc.Driver
debug=true
2。 Test123Application.java
package com.example;
....all imports...
@SpringBootApplication
public class Test123Application extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(Test123Application.class, args);
}
}
3.Testcontroller.java
package com.example.controller;
....all imports...
@Controller
public class TestController {
@RequestMapping(value = "/")
public String demofunction(){
return "dummytemplate";
}
@RequestMapping("/default")
public String demofunction2(Model model){
Docrepo docrepo = new Docrepoimpl();
List<Docmaster> listContact = docrepo.list();
model.addAttribute("listContact", listContact);
return "dummytemplate2";
}
}
4. Docrepoimpl.java
package com.example.repository;
----all imports---
@Configuration
@Repository
public class Docrepoimpl implements Docrepo{
@Autowired
private JdbcTemplate jdbcTemplate;
public void adddoctor(Docmaster doc){
String sql = "INSERT INTO docmastertable (docid,name,yoe,speciality,degree,college,hospital,regno)"
+ " VALUES (?,?,?,?,?,?,?,?)";
jdbcTemplate.update(sql, doc.getdocid(), doc.getname(),doc.getyoe(), doc.getspeciality(),doc.getdegree(),doc.getcollege(),doc.gethospital(),doc.getregno());
}
public List <Docmaster> list(){
String sql = "SELECT * FROM docmastertable";
if(jdbcTemplate != null)
System.out.println("jdbc seems ok...");
else
System.out.println("jdbc is null...");
List<Docmaster> listContact = jdbcTemplate.query(sql, new RowMapper<Docmaster>() {
@Override
public Docmaster mapRow(ResultSet rs, int rowNum) throws SQLException {
Docmaster doc = new Docmaster();
doc.setdocid(rs.getString("docid"));
doc.setname(rs.getString("name"));
doc.setyoe(rs.getInt("yoe"));
doc.setspeciality(rs.getString("speciality"));
doc.setdegree(rs.getString("degree"));
doc.setcollege(rs.getString("college"));
doc.sethospital(rs.getString("hospital"));
doc.setregno(rs.getString("regno"));
return doc;
}
});
return listContact;
}
}
错误转储:
java.lang.NullPointerException: 空 在 com.example.repository.Docrepoimpl.list(Docrepoimpl.java:52) ~[类/:na] 在 com.example.controller.TestController.demofunction2(TestController.java:43) ~[类/:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)~[na:1.8.0_40] 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)~[na:1.8.0_40] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(来源不明)~[na:1.8.0_40] 在 java.lang.reflect.Method.invoke(来源不明)~[na:1.8.0_40] ...
实际上,您是直接在控制器 class 中使用 new
语句创建存储库。我还建议通过创建一个本地成员并用 @Autowired
注释将您的 Repo 注入到您的控制器 class 中。如果您不想遵循这种方式,您也可以向 Context
请求 return 一个现成的 bean。
当您尝试访问不受 Spring 引导框架也就是 Spring 引导容器管理的 Spring class 时,它总是会发生。
通过以下行,您可以获得任何 @Autowired 不起作用的 spring 引导 class。
这是一个class,我曾经在没有@Autowired 的情况下访问 JdbcTemplate。
public class MysqlServiceJava {
// You don't need @Autowired
JdbcTemplate jdbcTemplate;
public MysqlServiceJava() {
// Get JdbcTemplate through Context container AKA !! THE MAGIC !!
jdbcTemplate = ApplicationContextHolder.getContext().getBean(JdbcTemplate.class);
}
public List<Integer> findAllEasyId(){
List<Integer> Ids = new ArrayList<>();
String sql = "SELECT id FROM master_table";
jdbcTemplate.query(
sql, new Object[] {},
(rs, rowNum) -> new MasterTable(rs.getInt("id"))
).forEach(
masterTable ->
Ids.add(masterTable.getId()) // add Id to Ids List array
);
return Ids;
}
}
class MasterTable {
private Integer id;
public MasterTable(Integer id) {
this.id = id;
}
public Integer getId() {
return id;
}
@Override
public String toString() {
return "MasterTable{" +
"id=" + id +
'}';
}
public void setId(Integer id) {
this.id = id;
}
}
喜欢就点个赞吧=)