当我尝试在方法getEmployeeById中读取jdbcTemplate时,我得到空指针异常

时间:2017-10-22 10:52:43

标签: java spring jdbctemplate

在本代码中,每当调用storeEmployeeRecord()时,它都会读取jdbcTemplate,然后执行进一步的步骤来存储用户在表单中输入的数据,但问题是getEmployeeById()每当我调用此方法时它返回null。我还发现jdbcTemplate的一个问题是我的第一个方法是能够读取它,但是getEmployeeById()方法没有读取jdbcTemplate并将其diplaying为null

    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.List;

    import org.naman.commandbean.Employee;
    import org.naman.commandbean.SearchEmployeeResult;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.PreparedStatementSetter;
    import org.springframework.jdbc.core.RowMapper;
    import org.springframework.stereotype.Repository;

    @Repository
    public class EmployeeDAO {
        @Autowired
        private JdbcTemplate jdbcTemplate;

        public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
            this.jdbcTemplate = jdbcTemplate;
        }


        public int storeEmployeeRecord(final Employee employee) {
            System.out.println("In storeEmployeeRecord jdbcTemplate= " + jdbcTemplate);
            final String query = "insert into EMP_TBL values(?,?,?)";

            return jdbcTemplate.update(query, new PreparedStatementSetter() {

                public void setValues(PreparedStatement ps) throws SQLException {
                    ps.setInt(1, employee.getEno());
                    ps.setString(2, employee.getName());
                    ps.setDouble(3, employee.getSalary());
                }// end setValues
            });// end update

        }// end storeEmployeeRecord


        public List<SearchEmployeeResult> getEmployeeById(final Integer eno) {
            final String QUERY_TO_RETRIEVEBY_ENO = "select * from EMP_TBL where eno=?";
            System.out.println("In DAO_________jdbcTemplate= " + jdbcTemplate);
            return jdbcTemplate.query(QUERY_TO_RETRIEVEBY_ENO, new PreparedStatementSetter() {

                public void setValues(PreparedStatement ps) throws SQLException {
                    ps.setInt(1, eno);
                    System.out.println("PreparedStatement_______value set");
                }// end PreparedStatementSetter
            }, new RowMapper<SearchEmployeeResult>() {

                public SearchEmployeeResult mapRow(ResultSet rs, int rowNum) throws SQLException {

                    SearchEmployeeResult employeeResult = new SearchEmployeeResult();
                    employeeResult.setEno(rs.getInt(1));
                    employeeResult.setName(rs.getString(2));
                    employeeResult.setSalary(rs.getDouble(3));

                    System.out.println("All the values are in SearchEmployeeResult.....returning values");
                    return employeeResult;
                }// end mapRow
            }); // end RowMapper
        }

    }// end class 

[错误控制台预览:] [1]

  

这是Bean配置文件

@Configuration
@PropertySource("classpath:db.properties")
public class DbConfiguration {

    @Autowired
    private Environment environment;
    @Autowired
    private DataSource dataSource;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getProperty("db.DriverClassName"));
        dataSource.setUrl(environment.getProperty("db.Url"));
        dataSource.setUsername(environment.getProperty("db.Username"));
        dataSource.setPassword((environment.getProperty("db.Password")));
        System.out.println(environment.getProperty("db.Password"));
        return dataSource;
    }// end dataSource

    @Bean
    public JdbcTemplate setJdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }// end JdbcTemplate
}// end class
  

这是服务类

import java.util.List;

import org.naman.commandbean.Employee;
import org.naman.commandbean.SearchEmployeeResult;
import org.naman.dao.EmployeeDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class EmployeeService {

    @Autowired
    private EmployeeDAO employeeDAO;

    public int save(Employee employee) {
        return employeeDAO.storeEmployeeRecord(employee);
    }// end save

    public List<SearchEmployeeResult> getEmployeeById(Integer eno) {
        return new EmployeeDAO().getEmployeeById(eno);
    }// end getEmployeeById
}// end class
  

这是控制器

import java.util.List;

import javax.validation.Valid;

import org.naman.commandbean.Employee;
import org.naman.commandbean.SearchEmployee;
import org.naman.commandbean.SearchEmployeeResult;
import org.naman.service.EmployeeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class MyController {
    @Autowired
    private EmployeeService employeeService;
    @RequestMapping(path = "/store", method = RequestMethod.GET)
    public String displayForm(Employee employee, Model model) {

        model.addAttribute("employee", employee);
        return "employeeDataCapture";
    }

    @RequestMapping(path = "/store", method = RequestMethod.POST)
    public String processData(@Valid Employee employee, BindingResult errors, Model model) {
        if (errors.hasErrors()) {
            return "employeeDataCapture";
        } // end if
        int saveEmloyeeDetails = employeeService.save(employee);
        model.addAttribute("employeeData", saveEmloyeeDetails);
        return "employeeDataSuccess";
    }    
    @RequestMapping(path = "/search", method = RequestMethod.GET)
    public String displayAllEmployeesFrom(SearchEmployee searchEmployee, Model model) {
        model.addAttribute("searchEmployee", searchEmployee);
        return "search";
    }// end displayAllEmployeesFrom

    @RequestMapping(path = "/search", method = RequestMethod.POST)
    private String employeeSearchResult(@Valid SearchEmployee searchEmployee, BindingResult errors, Model model) {
        if (errors.hasErrors()) {
            return "search";
        } // end if

        List<SearchEmployeeResult> result = employeeService.getEmployeeById(searchEmployee.getEno());
        model.addAttribute("searchResult", result);
        return "searchResult";
    }
}//end class

1 个答案:

答案 0 :(得分:0)

可能有3点需要解决:

  1. 移除@Autowired private DataSource dataSource;中的DbConfiguration,您已经采用@Bean方法配置DataSource

  2. 删除DAO中的setJdbcTemplate方法。您在字段中找到了@Autowire

  3. @ComponentScan(basePackages = "org.naman")添加到您的DbConfiguration。这将扫描组件(包含@Repository@Service等的每个类,并将依赖项注入其中。

  4. 实际修复:

    将您的方法改为:public List<SearchEmployeeResult> getEmployeeById(Integer eno) { return employeeDAO.getEmployeeById(eno); }
        您从不自己创建您的Bean。这就是Spring的用途。 Spring jdbcTemplate未设置getEmployeeById,因此它为空。