Spring抽象父类和子类的Spring配置问题

时间:2015-07-07 16:10:27

标签: java mysql spring dependency-injection spring-ioc

我正在尝试使用以下代码。基本上我在mysql数据库中有一个名为alert_settings的表。下面是我如何配置它和类。

    <?xml version="1.0" encoding="UTF-8"?>
<beans 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/jdbc 
        http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd
        ">

    <!-- DriverManagerDataSource : Spring simplest implementation of a DataSource (doesn�??t support database connection pooling)-->

    <bean id="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName"  value="${jdbc.driverClassName}" />
        <property name="url"              value="${jdbc.url}" />
        <property name="username"         value="${jdbc.username}" />
        <property name="password"         value="${jdbc.password}" />
    </bean>


    <!-- The properties file containing the values for the JDBC datasource-->   
    <context:property-placeholder location="jdbc.properties"/>


    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="abstractBaseClass" abstract="true" class="org.jay.dao.impl.spring.commons.GenericDAO">
      <property name="dataSource" value="dataSource"/>
    </bean>

    <bean id="alertSettingDAO" class="org.jay.dao.impl.spring.AlertSettingDAOImplSpring" parent="abstractBaseClass">     
      <!--Override the value of the abstract based class if necessary-->
      <property name="dataSource" value="dataSource"/>
    </bean>

下面是我的抽象通用DAO,警报设置DAO接口和实际的DAO类。

  • Abstract Generic DAO

    public abstract class GenericDAO<T> {
    
    /**
     * The DataSource providing the connections (injected by Spring)
     */
    @Resource(name="dataSource")
    private DataSource dataSource;
    
    /**
     * The auto-incremented column name if any (null if none)
     */
    private final String  autoIncrColumnName ;
    
    /**
     * The columns types for each value to be inserted with an auto-incremented key (null if no auto-incremented column)
     */
    private final int[]   insertJdbcTypes ;
    
    /**
     * Constructor for a standard table (without auto-incremented column)
     */
    protected GenericDAO() {
        super();
        this.autoIncrColumnName = null ;
        this.insertJdbcTypes = null ;
    }
    
    /**
     * Constructor for a table with an auto-incremented key
     * @param autoIncrColumnName
     * @param insertJdbcTypes
     */
    protected GenericDAO(String autoIncrColumnName, int[] insertJdbcTypes) {
        super();
        this.autoIncrColumnName = autoIncrColumnName ;
        this.insertJdbcTypes = insertJdbcTypes ;
    }
    
    /**
     * Returns the SQL SELECT REQUEST to be used to retrieve the bean data from the database
     * @return
     */
    protected abstract String  getSqlSelect();
    
    /**
     * Returns the SQL INSERT REQUEST to be used to insert the bean in the database
     * @return
     */
    protected abstract String  getSqlInsert();
    
    /**
     * Returns the SQL UPDATE REQUEST to be used to update the bean in the database
     * @return
     */
    protected abstract String  getSqlUpdate();
    
    /**
     * Returns the SQL DELETE REQUEST to be used to delete the bean from the database
     * @return
     */
    protected abstract String  getSqlDelete();
    
    /**
     * Returns the SQL COUNT REQUEST to be used to check if the bean exists in the database
     * @return
     */
    protected abstract String  getSqlCount();
    
    /**
     * Returns the SQL COUNT REQUEST to be used to count all the beans present in the database
     * @return
     */
    protected abstract String  getSqlCountAll();
    
    /**
     * Returns the values to be used in the SQL INSERT PreparedStatement
     * @param bean
     * @return
     */
    protected abstract Object[] getValuesForInsert(T bean) ; 
    
    /**
     * Returns the values to be used in the SQL UPDATE PreparedStatement
     * @param bean
     * @return
     */
    protected abstract Object[] getValuesForUpdate(T bean) ; 
    
    /**
     * Returns the values to be used as Primary Key in a SQL WHERE clause in a PreparedStatement
     * @param bean
     * @return
     */
    protected abstract Object[] getValuesForPrimaryKey(T bean);
    
    /**
     * Returns a RowMapper for the given bean
     * @param bean
     * @return
     */
    protected abstract RowMapper<T>  getRowMapper(T bean);
    
    /**
     * Returns a RowMapper for a new bean instance
     * @return
     */
    protected abstract RowMapper<T>  getRowMapper();
    
    //-----------------------------------------------------------------------------------------
    private void log(String msg) {
        //System.out.println("[DAO LOG] : " + msg );
    }
    
    //-----------------------------------------------------------------------------------------
    /**
     * Returns an instance of Spring 'JdbcTemplate' for the current DataSource
     * @return
     */
    private JdbcTemplate getJdbcTemplate() {
        return new JdbcTemplate(dataSource);
    }
    
    //-----------------------------------------------------------------------------------------
    /**
     * Loads the given bean from the database using its current primary key (SQL SELECT)<br>
     * If found the given bean is populated 
     * @param bean
     * @return true if found and loaded, false if not found
     */
    protected boolean doSelect(T bean) {
    
        log("Select using a bean instance : " + bean );
        Object[] primaryKey = getValuesForPrimaryKey(bean);
        log("Select using a bean instance : Primary Key = " + toString(primaryKey) );
        RowMapper<T> rowMapper = getRowMapper(bean) ;
        JdbcTemplate jdbcTemplate = getJdbcTemplate();
        //--- Try to find the record. NB : Spring throws "EmptyResultDataAccessException" if not found
        try {
            T beanFound = jdbcTemplate.queryForObject(getSqlSelect(), primaryKey, rowMapper);
            if ( beanFound != bean ) {
                throw new RuntimeException("Unexpected instance returned by JdbcTemplate");
            }
            return true ;
        } catch (EmptyResultDataAccessException e) {
            // Nothing to do, just return "not found"
            return false;
        }
    }
    
    //-----------------------------------------------------------------------------------------
    /**
     * Loads a bean from the database using the given primary key (SQL SELECT)<br>
     * @param primaryKey
     * @return the bean found or null if not found
     */
    protected T doSelect(Object[] primaryKey) {
        log("Select by Primary Key : " + toString(primaryKey) );
        RowMapper<T> rowMapper = getRowMapper() ;
        JdbcTemplate jdbcTemplate = getJdbcTemplate();
        //--- Try to find the record. NB : Spring throws "EmptyResultDataAccessException" if not found
        try {
            return jdbcTemplate.queryForObject(getSqlSelect(), primaryKey, rowMapper);
        } catch (EmptyResultDataAccessException e) {
            // Nothing to do, just return null
            return null;
        }
    }
    
    //-----------------------------------------------------------------------------------------
    /**
     * Inserts the given bean in the database (SQL INSERT)
     * @param bean
     */
    protected void doInsert(T bean) {
        JdbcTemplate jdbcTemplate = getJdbcTemplate(); 
        //--- Execute INSERT
        int result = jdbcTemplate.update(getSqlInsert(), getValuesForInsert(bean) );
        if ( result != 1 ) {
            throw new RuntimeException("Unexpected return value after INSERT : " + result + " (1 expected) ");
        }
    }   
    
    //-----------------------------------------------------------------------------------------
    /**
     * Returns a 'PreparedStatementCreator' usable with a 'KeyHolder' for an insert with an auto-incremented key
     * @param bean
     * @return
     */
    private PreparedStatementCreator getPreparedStatementCreator(final T bean) {
        //log("getPreparedStatementCreator : auto incr col = " + autoIncrColumnName  );
        //log("getPreparedStatementCreator : sql insert = " + getSqlInsert() );
        PreparedStatementCreatorFactory factory = new PreparedStatementCreatorFactory(getSqlInsert(), this.insertJdbcTypes) ;
    
        factory.setGeneratedKeysColumnNames(new String[]{autoIncrColumnName});
        //log("before newPreparedStatementCreator : values for insert = " + toString(getValuesForInsert(bean)));
        PreparedStatementCreator psc = factory.newPreparedStatementCreator(getValuesForInsert(bean));
        //log("after newPreparedStatementCreator ");
        return psc ;
    }
    //-----------------------------------------------------------------------------------------
    /**
     * Inserts the given bean in the database (SQL INSERT) with an auto-incremented key
     * @param bean
     * @return the value of the generated key
     */
    protected long doInsertAutoIncr(final T bean) {
        JdbcTemplate jdbcTemplate = getJdbcTemplate(); 
        // GeneratedKeyHolder : the default implementation of the KeyHolder interface, to be used for holding auto-generated keys 
        KeyHolder keyHolder = new GeneratedKeyHolder(); 
    
        int result = jdbcTemplate.update(getPreparedStatementCreator(bean), keyHolder );
    
        if ( result != 1 ) {
            throw new RuntimeException("Unexpected return value after INSERT : " + result + " (1 expected) ");
        }
    
        //--- Retrieve the generated value
        Number key = keyHolder.getKey(); // Single numeric generated key
        if ( key != null ) {
            return key.longValue();
        }
        else {
            throw new RuntimeException("Cannot retrive generated key after INSERT : KeyHolder returns null");
        }
    }   
    //-----------------------------------------------------------------------------------------
    /**
     * Inserts the given bean in the database (SQL INSERT) with an auto-incremented column (usually the primary key)
     * @param bean
     * @return the generated value for the auto-incremented column
     */
    protected Long doInsertAutoIncrOLD(T bean ) {
    
        JdbcTemplate jdbcTemplate = getJdbcTemplate(); 
        // GeneratedKeyHolder : the default implementation of the KeyHolder interface, to be used for holding auto-generated keys 
        KeyHolder keyHolder = new GeneratedKeyHolder(); 
    
        //--- FORM 2 with only the KeyHolder
        int result = jdbcTemplate.update(getSqlInsert(), getValuesForInsert(bean), keyHolder, new String[]{autoIncrColumnName} );
    
        if ( result != 1 ) {
            throw new RuntimeException("Unexpected return value after INSERT : " + result + " (1 expected) ");
        }
    
        //--- Retrieve the generated value
        Number key = keyHolder.getKey(); // Single numeric generated key
        if ( key != null ) {
            return key.longValue();
        }
        else {
            throw new RuntimeException("Cannot retrive generated key after INSERT : KeyHolder returns null");
        }
    }   
    
    //-----------------------------------------------------------------------------------------
    /**
     * Updates the given bean in the database (SQL UPDATE)
     * @param bean the bean to be updated
     * @return the JDBC return code (i.e. the row count affected by the UPDATE operation : 0 or 1 )
     */
    protected int doUpdate(T bean) {
        JdbcTemplate jdbcTemplate = getJdbcTemplate(); 
        //--- Execute UPDATE
        int result = jdbcTemplate.update( getSqlUpdate(), getValuesForUpdate(bean) );
        if ( result != 0 && result != 1 ) {
            throw new RuntimeException("Unexpected return value after UPDATE : " + result + " (0 or 1 expected) ");
        }
        return result ;
    }   
    //-----------------------------------------------------------------------------------------
    /**
     * Deletes the given bean in the database (SQL DELETE)
     * @param bean the bean to be deleted (containing the Primary Key)
     * @return the JDBC return code (i.e. the row count affected by the DELETE operation : 0 or 1 )
     */
    protected int doDelete(T bean) {
        return doDelete( getValuesForPrimaryKey(bean) ) ;
    }
    
    
    protected int doDelete(Object[] primaryKey) {
        JdbcTemplate jdbcTemplate = getJdbcTemplate(); 
        //--- Execute DELETE
        int result = jdbcTemplate.update(getSqlDelete(), primaryKey);
        if ( result != 0 && result != 1 ) {
            throw new RuntimeException("Unexpected return value after DELETE : " + result + " (0 or 1 expected) ");
        }
        return result ;
    }
    
    
    protected boolean doExists(T bean) {
        return doExists( getValuesForPrimaryKey(bean) );
    }
    
    
    protected boolean doExists(Object[] primaryKey) {
        JdbcTemplate jdbcTemplate = getJdbcTemplate(); 
        long count = jdbcTemplate.queryForObject(getSqlCount(), primaryKey, Long.class);
        return count > 0 ;
    }
    
    
    protected long doCountAll() {
        JdbcTemplate jdbcTemplate = getJdbcTemplate(); 
        return jdbcTemplate.queryForObject(getSqlCountAll(), Long.class);
    }
    
    
    protected String toString(Object[] objects) {
        if ( objects != null ) {
            StringBuilder sb = new StringBuilder();
            sb.append("[");
            int i = 0 ;
            for ( Object o : objects ) {
                if ( i > 0 ) {
                    sb.append("|");
                }
                sb.append(o.toString());
                i++;
            }
            sb.append("]");
            return sb.toString();
        }
        else {
            return "null" ;
        }
    }
    

    }

  • AlertSettingDAO接口

    public interface AlertSettingDAO {
    
    
        /**
         * Finds a bean by its primary key 
         * @param userToken
         * @return the bean found or null if not found 
         */
        public AlertSetting find( String userToken ) ;
    
        //----------------------------------------------------------------------
        /**
         * Loads the given bean, it is supposed to contains the primary key value(s) in its attribute(s)<br>
         * If found, the given instance is populated with the values retrieved from the database<br>
         * If not found, the given instance remains unchanged
         * @param alertSetting
         * @return true if found, false if not found
         */
        public boolean load( AlertSetting alertSetting ) ;
    
        //----------------------------------------------------------------------
        /**
         * Inserts the given bean in the database 
         * @param alertSetting
         */
        public void insert(AlertSetting alertSetting) ;
    
        //----------------------------------------------------------------------
        /**
         * Updates the given bean in the database 
         * @param alertSetting
         * @return
         */
        public int update(AlertSetting alertSetting) ;
    
        //----------------------------------------------------------------------
        /**
         * Deletes the record in the database using the given primary key value(s) 
         * @param userToken
         * @return
         */
        public int delete( String userToken ) ;
    
        //----------------------------------------------------------------------
        /**
         * Deletes the given bean in the database 
         * @param alertSetting
         * @return
         */
        public int delete( AlertSetting alertSetting ) ;
    
        //----------------------------------------------------------------------
        /**
         * Checks the existence of a record in the database using the given primary key value(s)
         * @param userToken
         * @return
         */
        public boolean exists( String userToken ) ;
    
    
        public boolean exists( AlertSetting alertSetting ) ;
    
    
        public long count() ;
    
    }
    
  • 和3. AlertSettingDAO实施类

@Repository 公共类AlertSettingDAOImplSpring扩展GenericDAO实现AlertSettingDAO {

private final static String SQL_SELECT = 
    "select user_token, sms_enabled, sms_settle_enabled, sms_load_enabled, sms_unload_enabled, sms_auth_enabled, sms_decline_enabled, sms_chargeback_enabled, sms_promo_enabled, sms_flagged_for_failures, 2way_enabled, email_alert_enabled from alert_setting where user_token = ?";


private final static String SQL_INSERT = 
    "insert into alert_setting ( user_token, sms_enabled, sms_settle_enabled, sms_load_enabled, sms_unload_enabled, sms_auth_enabled, sms_decline_enabled, sms_chargeback_enabled, sms_promo_enabled, sms_flagged_for_failures, 2way_enabled, email_alert_enabled ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )";

private final static String SQL_UPDATE = 
    "update alert_setting set sms_enabled = ?, sms_settle_enabled = ?, sms_load_enabled = ?, sms_unload_enabled = ?, sms_auth_enabled = ?, sms_decline_enabled = ?, sms_chargeback_enabled = ?, sms_promo_enabled = ?, sms_flagged_for_failures = ?, 2way_enabled = ?, email_alert_enabled = ? where user_token = ?";

private final static String SQL_DELETE = 
    "delete from alert_setting where user_token = ?";

private final static String SQL_COUNT_ALL = 
    "select count(*) from alert_setting";

private final static String SQL_COUNT = 
    "select count(*) from alert_setting where user_token = ?";

//----------------------------------------------------------------------
/**
 * DAO constructor
 */
public AlertSettingDAOImplSpring() {
    super();
}

//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public AlertSetting find( String userToken ) {
    Object[] primaryKey = new Object[] { userToken };
    return super.doSelect(primaryKey);      
}
//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public boolean load( AlertSetting alertSetting ) {
    return super.doSelect(alertSetting) ;
}

//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public void insert(AlertSetting alertSetting) {
    super.doInsert(alertSetting);
}   

//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public int update(AlertSetting alertSetting) {
    return super.doUpdate(alertSetting);
}   

//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public int delete( String userToken ) {
    Object[] primaryKey = new Object[] { userToken };
    return super.doDelete(primaryKey);      
}

//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public int delete( AlertSetting alertSetting ) {
    return super.doDelete(alertSetting);
}

//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public boolean exists( String userToken ) {
    Object[] primaryKey = new Object[] { userToken };
    return super.doExists(primaryKey);
}
//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public boolean exists( AlertSetting alertSetting ) {
    return super.doExists(alertSetting);
}

//----------------------------------------------------------------------
/* (non-Javadoc)
 * DAO interface implementation
 */
@Override
public long count() {
    return super.doCountAll();
}

//----------------------------------------------------------------------
// Super class abstract methods implementation
//----------------------------------------------------------------------
@Override
protected String getSqlSelect() {
    return SQL_SELECT ;
}
//----------------------------------------------------------------------
@Override
protected String getSqlInsert() {
    return SQL_INSERT ;
}
//----------------------------------------------------------------------
@Override
protected String getSqlUpdate() {
    return SQL_UPDATE ;
}
//----------------------------------------------------------------------
@Override
protected String getSqlDelete() {
    return SQL_DELETE ;
}
//----------------------------------------------------------------------
@Override
protected String getSqlCount() {
    return SQL_COUNT ;
}
//----------------------------------------------------------------------
@Override
protected String getSqlCountAll() {
    return SQL_COUNT_ALL ;
}
//----------------------------------------------------------------------
@Override
protected Object[] getValuesForInsert(AlertSetting alertSetting)  {
    return new Object[] {
        //--- Returns PRIMARY KEY and DATA ( for SQL "SET x=?, y=?, ..." )
        alertSetting.getUserToken() , // "user_token" : java.lang.String
        alertSetting.getSmsEnabled() , // "sms_enabled" : java.lang.Integer
        alertSetting.getSmsSettleEnabled() , // "sms_settle_enabled" : java.lang.Integer
        alertSetting.getSmsLoadEnabled() , // "sms_load_enabled" : java.lang.Integer
        alertSetting.getSmsUnloadEnabled() , // "sms_unload_enabled" : java.lang.Integer
        alertSetting.getSmsAuthEnabled() , // "sms_auth_enabled" : java.lang.Integer
        alertSetting.getSmsDeclineEnabled() , // "sms_decline_enabled" : java.lang.Integer
        alertSetting.getSmsChargebackEnabled() , // "sms_chargeback_enabled" : java.lang.Integer
        alertSetting.getSmsPromoEnabled() , // "sms_promo_enabled" : java.lang.Integer
        alertSetting.getSmsFlaggedForFailures() , // "sms_flagged_for_failures" : java.lang.Integer
        alertSetting.getTwoWayEnabled() , // "2way_enabled" : java.lang.Integer
        alertSetting.getEmailAlertEnabled()  // "email_alert_enabled" : java.lang.Integer
    };
}
//----------------------------------------------------------------------
@Override
protected Object[] getValuesForUpdate(AlertSetting alertSetting) {
    return new Object[] {       
        //--- Returns DATA first ( for SQL "SET x=?, y=?, ..." )
        alertSetting.getSmsEnabled(), // "sms_enabled" : java.lang.Integer
        alertSetting.getSmsSettleEnabled(), // "sms_settle_enabled" : java.lang.Integer
        alertSetting.getSmsLoadEnabled(), // "sms_load_enabled" : java.lang.Integer
        alertSetting.getSmsUnloadEnabled(), // "sms_unload_enabled" : java.lang.Integer
        alertSetting.getSmsAuthEnabled(), // "sms_auth_enabled" : java.lang.Integer
        alertSetting.getSmsDeclineEnabled(), // "sms_decline_enabled" : java.lang.Integer
        alertSetting.getSmsChargebackEnabled(), // "sms_chargeback_enabled" : java.lang.Integer
        alertSetting.getSmsPromoEnabled(), // "sms_promo_enabled" : java.lang.Integer
        alertSetting.getSmsFlaggedForFailures(), // "sms_flagged_for_failures" : java.lang.Integer
        alertSetting.getTwoWayEnabled(), // "2way_enabled" : java.lang.Integer
        alertSetting.getEmailAlertEnabled(), // "email_alert_enabled" : java.lang.Integer
        //--- Returns PRIMARY KEY at the end ( for SQL "WHERE key=?, ..." )
        alertSetting.getUserToken()  // "user_token" : java.lang.String
    };
}
//----------------------------------------------------------------------
@Override
protected Object[] getValuesForPrimaryKey(AlertSetting alertSetting)  {
    return new Object[] {
        //--- Returns PRIMARY KEY values ( for SQL "WHERE key=?, ..." )
        alertSetting.getUserToken()  // "user_token" : java.lang.String
    };
}
//----------------------------------------------------------------------
@Override
protected RowMapper<AlertSetting> getRowMapper(AlertSetting o)  {
    //--- RowMapper to populate the given bean instance
    return new AlertSettingRowMapper(o) ;
}
//----------------------------------------------------------------------
@Override
protected RowMapper<AlertSetting> getRowMapper()  {
    //--- RowMapper to populate a new bean instance
    return new AlertSettingRowMapper( new AlertSetting() ) ;
}

//----------------------------------------------------------------------
/**
 * Populates the given bean with the data retrieved from the given ResultSet
 * @param rs
 * @param alertSetting
 * @throws SQLException
 */
private void populateBean(ResultSet rs, AlertSetting alertSetting) throws SQLException {

    //--- Set data from ResultSet to Bean attributes
    alertSetting.setUserToken(rs.getString("user_token")); // java.lang.String
    alertSetting.setSmsEnabled(rs.getInt("sms_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setSmsSettleEnabled(rs.getInt("sms_settle_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsSettleEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setSmsLoadEnabled(rs.getInt("sms_load_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsLoadEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setSmsUnloadEnabled(rs.getInt("sms_unload_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsUnloadEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setSmsAuthEnabled(rs.getInt("sms_auth_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsAuthEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setSmsDeclineEnabled(rs.getInt("sms_decline_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsDeclineEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setSmsChargebackEnabled(rs.getInt("sms_chargeback_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsChargebackEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setSmsPromoEnabled(rs.getInt("sms_promo_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsPromoEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setSmsFlaggedForFailures(rs.getInt("sms_flagged_for_failures")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setSmsFlaggedForFailures(null); }; // not primitive number => keep null value if any
    alertSetting.setTwoWayEnabled(rs.getInt("2way_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setTwoWayEnabled(null); }; // not primitive number => keep null value if any
    alertSetting.setEmailAlertEnabled(rs.getInt("email_alert_enabled")); // java.lang.Integer
    if ( rs.wasNull() ) { alertSetting.setEmailAlertEnabled(null); }; // not primitive number => keep null value if any
}

//----------------------------------------------------------------------
/**
 * Specific inner class for 'RowMapper' implementation
 */
private class AlertSettingRowMapper implements RowMapper<AlertSetting> {


    private final AlertSetting bean ;


    AlertSettingRowMapper(AlertSetting bean) {
        this.bean = bean ;
    }

    @Override
    public AlertSetting mapRow(ResultSet rs, int rowNum) throws SQLException {
        populateBean(rs, this.bean);
        return this.bean;
    }
}

}

这是我的主要课程

public class Test {  
public static void main(String[] args) {  

    Resource resource=new ClassPathResource("spring-context.xml");  
    BeanFactory factory=new XmlBeanFactory(resource);  
    AlertSettingDAOImplSpring a = (AlertSettingDAOImplSpring) factory.getBean("alertSettingDAO");
    System.out.println(a.find("Anil").toString());
}  
}  

Error creating bean with name 'alertSettingDAO' defined in class path resource [spring-context.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'dataSource' of bean class [org.jay.dao.impl.spring.AlertSettingDAOImplSpring]: Bean property 'dataSource' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?

我哪里错了?如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

错误很清楚,你的课程中没有DataSource的getter和setter。

你的Spring配置也是错误的,你正在使用value="dataSource"并且spring期望这些类具有属性dataSource的字符串的getter和setter。您必须将其更改为使用ref="dataSource",如下所示:

<bean id="abstractBaseClass" abstract="true" class="org.jay.dao.impl.spring.commons.GenericDAO">
  <property name="dataSource" ref="dataSource"/>
</bean>

<bean id="alertSettingDAO" class="org.jay.dao.impl.spring.AlertSettingDAOImplSpring" parent="abstractBaseClass">     
  <!--Override the value of the abstract based class if necessary-->
  <property name="dataSource" ref="dataSource"/>
</bean>

同时删除@Resource注释

private DataSource dataSource;

并确保在您尝试注入对象引用的类中创建getter和setter。

如果您不想让getter和setter从Spring配置中删除<property name="dataSource"...声明并改为使用@Autowired:

@Autowired
private DataSource dataSource;