java - Spring configuration issue with abstract parent class and child class -


i trying following code work. have table called alert_settings in mysql database. below how configured , classes.

    <?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 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>       <!-- properties file containing values 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 value of abstract based class if necessary-->       <property name="datasource" value="datasource"/>     </bean> 

below abstract generic dao, alert settings dao interface , actual dao class.

  • abstract generic dao

    public abstract class genericdao<t> {  /**  * datasource providing connections (injected spring)  */ @resource(name="datasource") private datasource datasource;  /**  * auto-incremented column name if (null if none)  */ private final string  autoincrcolumnname ;  /**  * columns types each value inserted auto-incremented key (null if no auto-incremented column)  */ private final int[]   insertjdbctypes ;  /**  * constructor standard table (without auto-incremented column)  */ protected genericdao() {     super();     this.autoincrcolumnname = null ;     this.insertjdbctypes = null ; }  /**  * constructor table auto-incremented key  * @param autoincrcolumnname  * @param insertjdbctypes  */ protected genericdao(string autoincrcolumnname, int[] insertjdbctypes) {     super();     this.autoincrcolumnname = autoincrcolumnname ;     this.insertjdbctypes = insertjdbctypes ; }  /**  * returns sql select request used retrieve bean data database  * @return  */ protected abstract string  getsqlselect();  /**  * returns sql insert request used insert bean in database  * @return  */ protected abstract string  getsqlinsert();  /**  * returns sql update request used update bean in database  * @return  */ protected abstract string  getsqlupdate();  /**  * returns sql delete request used delete bean database  * @return  */ protected abstract string  getsqldelete();  /**  * returns sql count request used check if bean exists in database  * @return  */ protected abstract string  getsqlcount();  /**  * returns sql count request used count beans present in database  * @return  */ protected abstract string  getsqlcountall();  /**  * returns values used in sql insert preparedstatement  * @param bean  * @return  */ protected abstract object[] getvaluesforinsert(t bean) ;   /**  * returns values used in sql update preparedstatement  * @param bean  * @return  */ protected abstract object[] getvaluesforupdate(t bean) ;   /**  * returns values used primary key in sql clause in preparedstatement  * @param bean  * @return  */ protected abstract object[] getvaluesforprimarykey(t bean);  /**  * returns rowmapper given bean  * @param bean  * @return  */ protected abstract rowmapper<t>  getrowmapper(t bean);  /**  * returns rowmapper new bean instance  * @return  */ protected abstract rowmapper<t>  getrowmapper();  //----------------------------------------------------------------------------------------- private void log(string msg) {     //system.out.println("[dao log] : " + msg ); }  //----------------------------------------------------------------------------------------- /**  * returns instance of spring 'jdbctemplate' current datasource  * @return  */ private jdbctemplate getjdbctemplate() {     return new jdbctemplate(datasource); }  //----------------------------------------------------------------------------------------- /**  * loads given bean database using current primary key (sql select)<br>  * if found given bean populated   * @param bean  * @return true if found , loaded, false if not found  */ protected boolean doselect(t bean) {      log("select using bean instance : " + bean );     object[] primarykey = getvaluesforprimarykey(bean);     log("select using bean instance : primary key = " + tostring(primarykey) );     rowmapper<t> rowmapper = getrowmapper(bean) ;     jdbctemplate jdbctemplate = getjdbctemplate();     //--- try find 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 jdbctemplate");         }         return true ;     } catch (emptyresultdataaccessexception e) {         // nothing do, return "not found"         return false;     } }  //----------------------------------------------------------------------------------------- /**  * loads bean database using given primary key (sql select)<br>  * @param primarykey  * @return bean found or null if not found  */ protected t doselect(object[] primarykey) {     log("select primary key : " + tostring(primarykey) );     rowmapper<t> rowmapper = getrowmapper() ;     jdbctemplate jdbctemplate = getjdbctemplate();     //--- try find record. nb : spring throws "emptyresultdataaccessexception" if not found     try {         return jdbctemplate.queryforobject(getsqlselect(), primarykey, rowmapper);     } catch (emptyresultdataaccessexception e) {         // nothing do, return null         return null;     } }  //----------------------------------------------------------------------------------------- /**  * inserts given bean in 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 'preparedstatementcreator' usable 'keyholder' insert 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 insert = " + tostring(getvaluesforinsert(bean)));     preparedstatementcreator psc = factory.newpreparedstatementcreator(getvaluesforinsert(bean));     //log("after newpreparedstatementcreator ");     return psc ; } //----------------------------------------------------------------------------------------- /**  * inserts given bean in database (sql insert) auto-incremented key  * @param bean  * @return value of generated key  */ protected long doinsertautoincr(final t bean) {     jdbctemplate jdbctemplate = getjdbctemplate();      // generatedkeyholder : default implementation of keyholder interface, used 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 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 given bean in database (sql insert) auto-incremented column (usually primary key)  * @param bean  * @return generated value auto-incremented column  */ protected long doinsertautoincrold(t bean ) {      jdbctemplate jdbctemplate = getjdbctemplate();      // generatedkeyholder : default implementation of keyholder interface, used holding auto-generated keys      keyholder keyholder = new generatedkeyholder();       //--- form 2 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 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 given bean in database (sql update)  * @param bean bean updated  * @return jdbc return code (i.e. row count affected 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 given bean in database (sql delete)  * @param bean bean deleted (containing primary key)  * @return jdbc return code (i.e. row count affected 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 = 0 ;         ( object o : objects ) {             if ( > 0 ) {                 sb.append("|");             }             sb.append(o.tostring());             i++;         }         sb.append("]");         return sb.tostring();     }     else {         return "null" ;     } } 

    }

  • alertsettingdao interface

    public interface alertsettingdao {       /**      * finds bean primary key       * @param usertoken      * @return bean found or null if not found       */     public alertsetting find( string usertoken ) ;      //----------------------------------------------------------------------     /**      * loads given bean, supposed contains primary key value(s) in attribute(s)<br>      * if found, given instance populated values retrieved database<br>      * if not found, given instance remains unchanged      * @param alertsetting      * @return true if found, false if not found      */     public boolean load( alertsetting alertsetting ) ;      //----------------------------------------------------------------------     /**      * inserts given bean in database       * @param alertsetting      */     public void insert(alertsetting alertsetting) ;      //----------------------------------------------------------------------     /**      * updates given bean in database       * @param alertsetting      * @return      */     public int update(alertsetting alertsetting) ;      //----------------------------------------------------------------------     /**      * deletes record in database using given primary key value(s)       * @param usertoken      * @return      */     public int delete( string usertoken ) ;      //----------------------------------------------------------------------     /**      * deletes given bean in database       * @param alertsetting      * @return      */     public int delete( alertsetting alertsetting ) ;      //----------------------------------------------------------------------     /**      * checks existence of record in database using given primary key value(s)      * @param usertoken      * @return      */     public boolean exists( string usertoken ) ;       public boolean exists( alertsetting alertsetting ) ;       public long count() ;  } 
  • and 3. alertsettingdao implementation class

@repository public class alertsettingdaoimplspring extends genericdao implements 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 alert_setting user_token = ?";   private final static string sql_insert =      "insert 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 = ? user_token = ?";  private final static string sql_delete =      "delete alert_setting user_token = ?";  private final static string sql_count_all =      "select count(*) alert_setting";  private final static string sql_count =      "select count(*) alert_setting 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 , data ( 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 ( 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 @ end ( sql "where key=?, ..." )         alertsetting.getusertoken()  // "user_token" : java.lang.string     }; } //---------------------------------------------------------------------- @override protected object[] getvaluesforprimarykey(alertsetting alertsetting)  {     return new object[] {         //--- returns primary key values ( sql "where key=?, ..." )         alertsetting.getusertoken()  // "user_token" : java.lang.string     }; } //---------------------------------------------------------------------- @override protected rowmapper<alertsetting> getrowmapper(alertsetting o)  {     //--- rowmapper populate given bean instance     return new alertsettingrowmapper(o) ; } //---------------------------------------------------------------------- @override protected rowmapper<alertsetting> getrowmapper()  {     //--- rowmapper populate new bean instance     return new alertsettingrowmapper( new alertsetting() ) ; }  //---------------------------------------------------------------------- /**  * populates given bean data retrieved given resultset  * @param rs  * @param alertsetting  * @throws sqlexception  */ private void populatebean(resultset rs, alertsetting alertsetting) throws sqlexception {      //--- set data resultset 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     alertsetting.setsmssettleenabled(rs.getint("sms_settle_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setsmssettleenabled(null); }; // not primitive number => keep null value if     alertsetting.setsmsloadenabled(rs.getint("sms_load_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setsmsloadenabled(null); }; // not primitive number => keep null value if     alertsetting.setsmsunloadenabled(rs.getint("sms_unload_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setsmsunloadenabled(null); }; // not primitive number => keep null value if     alertsetting.setsmsauthenabled(rs.getint("sms_auth_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setsmsauthenabled(null); }; // not primitive number => keep null value if     alertsetting.setsmsdeclineenabled(rs.getint("sms_decline_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setsmsdeclineenabled(null); }; // not primitive number => keep null value if     alertsetting.setsmschargebackenabled(rs.getint("sms_chargeback_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setsmschargebackenabled(null); }; // not primitive number => keep null value if     alertsetting.setsmspromoenabled(rs.getint("sms_promo_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setsmspromoenabled(null); }; // not primitive number => keep null value if     alertsetting.setsmsflaggedforfailures(rs.getint("sms_flagged_for_failures")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setsmsflaggedforfailures(null); }; // not primitive number => keep null value if     alertsetting.settwowayenabled(rs.getint("2way_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.settwowayenabled(null); }; // not primitive number => keep null value if     alertsetting.setemailalertenabled(rs.getint("email_alert_enabled")); // java.lang.integer     if ( rs.wasnull() ) { alertsetting.setemailalertenabled(null); }; // not primitive number => keep null value if }  //---------------------------------------------------------------------- /**  * specific inner class '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;     } } 

}

this main class

public class test {   public static void main(string[] args) {        resource resource=new classpathresource("spring-context.xml");       beanfactory factory=new xmlbeanfactory(resource);       alertsettingdaoimplspring = (alertsettingdaoimplspring) factory.getbean("alertsettingdao");     system.out.println(a.find("anil").tostring()); }   }    error creating bean name 'alertsettingdao' defined in class path resource [spring-context.xml]: error setting property values; nested exception org.springframework.beans.notwritablepropertyexception: invalid property 'datasource' of bean class [org.jay.dao.impl.spring.alertsettingdaoimplspring]: bean property 'datasource' not writable or has invalid setter method. parameter type of setter match return type of getter? 

where going wrong? how right way?

the error pretty clear, don't have getters , setters datasource in classes.

also spring configuration wrong, using value="datasource" , spring expects classes have getters , setters of string property datasource. have change them use ref="datasource" in following:

<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 value of abstract based class if necessary-->   <property name="datasource" ref="datasource"/> </bean> 

also remove @resource annotation

private datasource datasource; 

and make sure getters , setters created in classes trying inject object reference.

if don't want getters , setters remove <property name="datasource"... declarations spring configuration , use @autowired instead:

@autowired private datasource datasource; 

Comments

Popular posts from this blog

toolbar - How to add link to user registration inside toobar in admin joomla 3 custom component -

linux - disk space limitation when creating war file -