【问题标题】:autowire DataSource to a class which extends JdbcDaoSupport将 DataSource 自动连接到扩展 JdbcDaoSupport 的类
【发布时间】:2015-10-05 02:31:09
【问题描述】:

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

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

DaoImpliment 类

@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 配置。

<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 配置中。 我是 spring 新手,请有人帮忙。

【问题讨论】:

  • 你的 DataSource 配置是在 xml 配置文件中定义的吗?
  • 是的。那已经在那里了。

标签: java spring datasource autowired spring-bean


【解决方案1】:

@Autowired 注释代替您管理初始化。当创建包含字段的对象时,即@Autowired,所有@Autowired 字段都被创建。

也就是说,你不需要下面的初始化方法。

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

【讨论】:

    【解决方案2】:

    我可以看到你 @Autowired DataSource 以及在导致 NestedServletException 的同一 UserDAOImpl 类中作为参考属性提供。您可以通过两种方式避免它:

    1. 在您的UserDAOImpl 类中从DataSource 中删除@Autowired,如下所示:

      @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配置文件中删除&lt;property name="dataSource" ref="dataSource" /&gt;,如下所示:

      <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>
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 2012-03-02
      • 2015-09-18
      • 1970-01-01
      相关资源
      最近更新 更多