Spring-Boot-jdbcTemplate对象未初始化

时间:2015-11-29 17:52:15

标签: spring-mvc nullpointerexception spring-boot jdbctemplate

我是Spring Boot / MVC的初学者。我一直在尝试构建一个查询包含医生主数据的表的基本示例。但是我反复得到" java.lang.NullPointerException" .Most可能是因为jdbcTemplate对象没有被初始化。 其他一些用户也遇到了这个问题,但是在他们的情况下,问题在包括starter-jdbc jar之后或在删除使用new运算符来创建jdbctemplate对象之后得到了解决。我已经在我的代码中考虑了这些建议。任何有关此事的帮助将不胜感激。我的代码片段如下:

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;     
        }
    }
  1. 错误转储:

    java.lang.NullPointerException:null     在com.example.repository.Docrepoimpl.list(Docrepoimpl.java:52)〜[classes /:na]     在com.example.controller.TestController.demofunction2(TestController.java:43)〜[classes /:na]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)〜[na:1.8.0_40]     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)〜[na:1.8.0_40]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)〜[na:1.8.0_40]     at java.lang.reflect.Method.invoke(Unknown Source)〜[na:1.8.0_40] ...

2 个答案:

答案 0 :(得分:1)

实际上,您正在使用new语句在控制器类中直接创建repo。我建议您通过创建本地成员并使用@Autowired对其进行注释来将Repo注入您的控制器类。如果您不想这样做,您也可以要求Context返回一个可以使用的bean。

答案 1 :(得分:0)

当您尝试访问不受Spring Boot框架(也就是Spring启动容器)管理的Spring类时,总是会发生这种情况。

在下面的行中,您可以获取任何@Autowired都不起作用的spring boot类。

这是我没有@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;
}

}

如果喜欢=,请竖起大拇指