将DataSource自动装配到扩展JdbcDaoSupport的类

时间:2015-07-15 20:47:46

标签: java spring datasource autowired spring-bean

我正在开发java,spring web应用程序。将DataSource添加到扩展JdbcDaoSupport的DAO实现类时遇到了一些问题。

我通过互联网搜索并找到了类似的解决方案。

DaoImpliment Class

@Repository
public class UserDAOImpl extends JdbcDaoSupport implements UserDAO {

@Autowired
private DataSource dataSource;

@PostConstruct
private void initialize() {
    setDataSource(dataSource);
}

public int getUserID(String userName) {
    //testing JDBC
    String sql = "select user_id from  users where username =" + "'" + userName + "'";
    List<UserDTO> userDTOs = new ArrayList<UserDTO>();

    List<Map<String, Object>> rows = getJdbcTemplate().queryForList(sql);
    for (Map row : rows) {
        UserDTO userDTO = new UserDTO();
        userDTO.setUserID((Integer) row.get("CUST_ID"));
        userDTOs.add(userDTO);
    }

    int userID = userDTOs.get(0).getUserID();

    return userID;
}
}

和我的豆子混淆。

<bean id="userDao" class="com.avers.dao.UserDAOImpl">
    <property name="dataSource" ref="dataSource" />
</bean>

    <bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">

    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/aversdb"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
</bean>

但这给了我错误。 org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是java.lang.NullPointerException

我认为错误是在bean配置中。 我刚接触春天,有人请求帮助。

2 个答案:

答案 0 :(得分:0)

我可以看到您@Autowired DataSource以及作为UserDAOImpl类引用NestedServletException的引用属性。您可以通过两种方式避免它:

  1. @Autowired课程中的DataSource移除UserDAOImpl,如下所示:

    @Repository
    public class UserDAOImpl extends JdbcDaoSupport implements UserDAO {
    
    private DataSource dataSource;
    
    @PostConstruct
    private void initialize() {
      setDataSource(dataSource);
    }
    
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }
    
    public int getUserID(String userName) {
        //testing JDBC
        String sql = "select user_id from  users where username =" + "'" + userName + "'";
        List<UserDTO> userDTOs = new ArrayList<UserDTO>();
    
        List<Map<String, Object>> rows = getJdbcTemplate().queryForList(sql);
        for (Map row : rows) {
            UserDTO userDTO = new UserDTO();
            userDTO.setUserID((Integer) row.get("CUST_ID"));
            userDTOs.add(userDTO);
        }
    
        int userID = userDTOs.get(0).getUserID();
    
        return userID;
      }
    }
    
  2. 或者从bean配置文件中删除<property name="dataSource" ref="dataSource" />,如下所示:

    <bean id="userDao" class="com.avers.dao.UserDAOImpl"/>
    <bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/aversdb"/>
    <property name="username" value="root"/>
    <property name="password" value=""/>
    </bean>
    

答案 1 :(得分:0)

@Autowired 注释管理初始化而不是您。当创建包含字段@Autowired的对象时,将创建所有@Autowired字段。

这意味着,您不需要以下初始化方法。

请评论并告诉我这是否有效。可以找到更多信息: http://www.mkyong.com/spring/spring-auto-wiring-beans-with-autowired-annotation/