我目前采用spring+struts+ibatis 准备在dao中使用泛型,然后定义了如下类,//定义dao的接口用了泛型
public interface EntityDAO<T>//定义dao的ibatis实现
public class IbatisEntityDao<T> extends IbatisGenericDao implements  EntityDAO<T>//ibatisdao的工具类
public class IbatisGenericDao extends SqlMapClientDaoSupport//定义了一个实际的dao接口
public interface UserAppsDetailsDao extends EntityDAO<UserAppsDetails>//定义了一个实际的dao接口的实现
public class UserAppsDetailsDaoImpl extends IbatisEntityDao<UserAppsDetails> implements UserAppsDetailsDao//model类
public class UserAppsDetails
//service类如下
public class UserAppsDetailsServiceImpl
//在这个类里面定义了属性如下
private UserAppsDetailsDao entityDao//action类
public class UserAppsDetailsAction 
//这个action类里面定义了一个 service属性
private UserAppsDetailsService entityService;接着我在spring的配置文件里这么进行配置 <bean id="userAppsDetailsDao" class="com.longtop.sysnet.dao.ibatis.UserAppsDetailsDaoImpl" scope="prototype" >
        <property name="sqlMapClient" ref="sqlMapClientPortal"></property>
</bean>
<bean id="userAppsDetailsService"  class="com.longtop.sysnet.service.entityservice.UserAppsDetailsServiceImpl" >
<property name="entityDao" ref="userAppsDetailsDao"/> 
</bean>
<bean id="userAppsDetailsAction_pageQuery" class="com.longtop.sysnet.controler.struts2.UserAppsDetailsAction" >
<property name="entityService" ref="userAppsDetailsService"/>
</bean>结果,
我通过http://localhost:7001/webroot/userAppsDetailsAction_pageQuery   访问的时候发现
在action类UserAppsDetailsAction 里的service属性 entityService 始终都是为空,怎么也注入不了不知怎么搞的
请问哪位高手能够告诉我,是不是我的配置文件写得不对

解决方案 »

  1.   

    或者哪个高手能给个 spring+ibatis+struts 的泛型dao例子
      

  2.   

    都有,就不知道 spring的泛型配置机制是什么
      

  3.   

    有可能是dao也是空,但是为什么为空呢,我试了不是泛型的dao都是好的,估计是泛型配置还是使用有问题,不知哪位高手能够帮忙解答,或者给个spring+ibatis+struts 配置泛型dao的例子
      

  4.   

    应该是没有配成spring object factory
      

  5.   

    我试了很多方式都没成功,所有代码如下:
    package com.longtop.sysnet.dao;
    import java.util.List;
    import java.util.Map;import org.apache.commons.lang.StringUtils;import com.longtop.sysnet.utility.Page;public interface EntityDAO<T> {
    /** 
     * 根据主键查找对象 
     *  
     * @param id 
     *            主键值 
     * @return 对象实体 
     */  
    T selectOne(java.util.Map param);    List<T> selectAll(Map param);


    /** 
     * 新增对象到数据库 
     *  
     * @param o 
     *            对象实体 
     */  
     Object insert(T o);   /** 
     * 更新对象实体到数据库 
     *  
     * @param o 
     *            对象实体 
     */  
     Integer update(T o);   /** 
     * 根据主键删除对象 
     *  
     * @param id 
     *            主键值 
     */  
     Integer delete(T o);  


    /** 
     * 分页查询. 
     */  
     Page pagedQuery(Map parameterObject, int start, int limit); /** 
     * 分页查询. 
     */  
    Page pagedQuery(Map parameterObject, int start, int limit,  
            String countSqlId, String pageQuerySqlId);
    /** 
     * 更新对象信息 
     *  
     * @param statementId 
     *            sql语句名称后缀 
     * @param parameters 
     *            sql参数 
     */  
    Integer update(String statementId, Map parameters);   Integer delete(String statementId, Map parameters); 

    Object insert(String statementId, Map parameters); 


    /** 
     * sql查询单个对象 
     *  
     * @param statementId 
     *            sql语句名称后缀 
     * @param parameters 
     *            sql参数 
     * @return 查询结果 
     */  
    T queryForObject(String statementId, Object parameters);   /** 
     * sql查询列表 
     *  
     * @param statementId 
     *            sql语句名称后缀 
     * @param parameters 
     *            sql参数 
     * @return 查询结果 
     */  
    List<T> queryForList(String statementId, Object parameters);  




    }
      

  6.   


    package com.longtop.sysnet.dao.ibatis;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;import org.apache.commons.lang.StringUtils;
    import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
    import org.springframework.util.Assert;import com.longtop.sysnet.dao.EntityDAO;
    import com.longtop.sysnet.dao.GenericsUtils;
    import com.longtop.sysnet.utility.Page;
    public class IbatisEntityDao<T> extends SqlMapClientDaoSupport implements  
        EntityDAO<T> {  
      public static final String POSTFIX_INSERT = ".insert";     public static final String POSTFIX_UPDATE = ".update";     public static final String POSTFIX_DELETE = ".delete";     public static final String POSTFIX_SELECT_ONE = ".selectOne";     public static final String POSTFIX_GETALL = ".selectAll";     public static final String POSTFIX_COUNT = ".count";     public static final String POSTFIX_QUERY = ".pageQuery"; 


    /** 
     * DAO所管理的Entity类型. 
     */  
    protected Class<T> entityClass;  protected String primaryKeyName;  /** 
     * 在构造函数中将泛型T.class赋给entityClass. 
     */  public IbatisEntityDao(Class<T> entityClass) {  
        entityClass =entityClass;// GenericsUtils.getSuperClassGenricType(getClass());  
    }  public IbatisEntityDao() {  
        entityClass =GenericsUtils.getSuperClassGenricType(getClass());  
    }  
     /** 
     * 根据ID获取对象. 
     */  
    public T selectOne(Map param) {  
        T o = (T) getSqlMapClientTemplate().queryForObject(  
                getStatementId(entityClass, IbatisGenericDao.POSTFIX_SELECT_ONE),  
                param);
        return o;  
    }  public List<T> selectAll(Map param) {  
        List<T> list = (List<T>) getSqlMapClientTemplate().queryForList(  
                getStatementId(entityClass, IbatisGenericDao.POSTFIX_GETALL),param);
        return list;  
    }  /** 
     * 取得entityClass. <p/> JDK1.4不支持泛型的子类可以抛开Class<T> entityClass,重载此函数达到相同效果。 
     */  
    protected Class<T> getEntityClass() {  
        return entityClass;  
    }  
     /** 
     * 分页查询. 
     */  
    public Page pagedQuery(Map parameterObject, int start, int limit) {  
        return pagedQuery(getEntityClass(), parameterObject, start, limit);  
    }  /** 
     * 分页查询. 
     */  
    public Page pagedQuery(Map parameterObject, int start, int limit,  
            String countSqlId, String pageQuerySqlId) {  
        if (StringUtils.isNotBlank(pageQuerySqlId))  
            return pagedQuery(getEntityClass(), parameterObject, start, limit,  
                    countSqlId, pageQuerySqlId);  
        else {  
            return pagedQuery(getEntityClass(), parameterObject, start, limit);  
        }  
    }  /** 
     * 分页查询函数,使用PaginatedList. 
     *  
     * @param start 
     *@param limit @return 含17117717记录数和当前页数据的Page对象. 
     *@param parameterObject 该参数包括:
     */  
    public Page pagedQuery(Class<T> entityClass, Map parameterObject, int start,  
            int limit) {      Assert.isTrue(start >= 0, "pageNo should start from 0");      // 计算总数   
        Integer totalCount = (Integer) getSqlMapClientTemplate()  
                .queryForObject(getStatementId(entityClass,  
                        IbatisGenericDao.POSTFIX_COUNT) ,  
                        parameterObject);    // 如果没有数据则返回Empty Page  
        Assert.notNull(totalCount, "totalCount Error");      if (totalCount.intValue() == 0) {  
            return new Page();  
        }      List list;  
        int totalPageCount = 0;  
        int startIndex = 0;      // 如果pageSize小于0,则返回所有数捄1177,等同于getAll  
        if (limit > 0) {          // 计算页数  
            totalPageCount = (totalCount / limit);  
            totalPageCount += ((totalCount % limit) > 0) ? 1 : 0;          // 计算skip数量  
            if (totalCount > start) {  
                startIndex = start;  
            } else {  
                startIndex = (totalPageCount - 1) * limit;  
            }          if (parameterObject == null)  
                parameterObject = new HashMap();          parameterObject.put("startIndex", startIndex);  
            parameterObject.put("endIndex", startIndex+limit);          list = getSqlMapClientTemplate()  
                    .queryForList(  
                            getStatementId(entityClass,  
                                    IbatisGenericDao.POSTFIX_QUERY),  
                            parameterObject);      } else {  
            list = getSqlMapClientTemplate()  
                    .queryForList(  
                            getStatementId(entityClass,  
                                    IbatisGenericDao.POSTFIX_QUERY),  
                            parameterObject);  
        }  
        
        return new Page(parameterObject,startIndex, totalCount, limit, list); 
        
    }  /** 
     * 分页查询函数,使用PaginatedList. 
     *  
     * @param start 
     *@param limit @return 含17117717记录数和当前页数据的Page对象. 
     */  
    public Page pagedQuery(Class<T> entityClass, Map parameterObject, int start,  
            int limit, String countSqlId, String pageQuerySqlId) {      Assert.isTrue(start >= 0, "pageNo should start from 0");      // 计算总数   
        Integer totalCount = (Integer) getSqlMapClientTemplate()  
                .queryForObject(  
                        getStatementId(entityClass,  
                                countSqlId),  
                        parameterObject);      // 如果没有数据则返回Empty Page  
        Assert.notNull(totalCount, "totalCount Error");      if (totalCount.intValue() == 0) {  
            return new Page();  
        }      List list;  
        int totalPageCount = 0;  
        int startIndex = 0;      // 如果pageSize小于0,则返回所有数捄1177,等同于getAll  
        if (limit > 0) {          // 计算页数  
            totalPageCount = (totalCount / limit);  
            totalPageCount += ((totalCount % limit) > 0) ? 1 : 0;          // 计算skip数量  
            if (totalCount >= start) {  
                startIndex = start;  
            } else {  
                startIndex = (totalPageCount - 1) * limit;  
            }          if (parameterObject == null)  
                parameterObject = new HashMap();          parameterObject.put("startIndex", startIndex);  
            parameterObject.put("endIndex",  startIndex+limit);          list = getSqlMapClientTemplate()  
                    .queryForList(  
                            getStatementId(entityClass,  
                                    pageQuerySqlId),  
                            parameterObject);      } else {  
            list = getSqlMapClientTemplate()  
                    .queryForList(  
                            getStatementId(entityClass,  
                                    pageQuerySqlId),  
                            parameterObject);  
        }
        
        return new Page(parameterObject,startIndex, totalCount, limit, list);  
    }  /** 
     * 根据ID移除对象. 
     */  
    public Integer delete(T o) {  
        return  getSqlMapClientTemplate().delete(  
                getStatementId(o.getClass(),  
                        IbatisGenericDao.POSTFIX_DELETE), o);   
    }  /** 
     * 保存对象. 为了实现IEntityDao 我在内部使用了insert和upate 2个方法. 
     */  
    public Object insert(T o) {  
        return getSqlMapClientTemplate().insert(  
                getStatementId(o.getClass(), IbatisGenericDao.POSTFIX_INSERT),  
                o);
    }  public Integer update(T o) {  
        return getSqlMapClientTemplate().update(  
                getStatementId(o.getClass(), IbatisGenericDao.POSTFIX_UPDATE),  
                o);  
    }public List<T> queryForList(String statementId, Object parameters) {  
        return getSqlMapClientTemplate().queryForList(  
                getStatementId(entityClass, statementId), parameters);  
    }  public T queryForObject(String statementId, Object parameters) {  
        return (T) getSqlMapClientTemplate().queryForObject(  
                getStatementId(entityClass, statementId), parameters);  
    }  public Integer update(String statementId, Map parameters) {  
        return getSqlMapClientTemplate().update(  
                getStatementId(entityClass, statementId), parameters);  
    }  
    public Integer delete(String statementId, Map parameters) {  
        return getSqlMapClientTemplate().delete(  
                getStatementId(entityClass, statementId), parameters);  
    } public Object insert(String statementId, Map parameters) {  
        return getSqlMapClientTemplate().insert(  
                getStatementId(entityClass, statementId), parameters);  
    }public void setEntityClass(Class<T> entityClass) {
    this.entityClass = entityClass;
    }public String getPrimaryKeyName() {
    return primaryKeyName;
    }public void setPrimaryKeyName(String primaryKeyName) {
    this.primaryKeyName = primaryKeyName;

    /** 
     * get statement id in SQL Map file 
     *  
     * @param entityClass 
     *            entity class 
     * @param suffix 
     *            suffix 
     * @return statement id 
     */  
    private String getStatementId(Class entityClass, String suffix) {  
        String className = entityClass.getName();  
        String shortName = className.replace(entityClass.getPackage().getName()  
                + ".", "");  
        return shortName + suffix;  
    }  }
      

  7.   

    package com.longtop.sysnet.dao.ibatis;import org.springframework.beans.factory.BeanFactory;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;import com.longtop.sysnet.dao.UserAppsDetailsDao;
    import com.longtop.sysnet.model.UserAppsDetails;public class UserAppsDetailsDaoImpl extends IbatisEntityDao<UserAppsDetails> implements UserAppsDetailsDao {
        public UserAppsDetailsDaoImpl(Class persistentClass) {           
            super(persistentClass);   
            //logger.debug("child class constructor " + persistentClass);   
        } }package com.longtop.sysnet.service.entityservice;import java.util.Map;import com.longtop.sysnet.model.UserAppsDetails;
    import com.longtop.sysnet.utility.Page;public interface EntityService<T> { Object insert(T paramModel);

    Boolean update(T paramModel);

    Boolean delete(T paramModel);

    Page pageQuery(String pageName,Map param, int start, int limit);

    T selectOne(Map param);
    }
    package com.longtop.sysnet.service.entityservice;import java.util.Map;import org.apache.poi.hssf.record.formula.functions.T;import com.longtop.sysnet.dao.EntityDAO;
    import com.longtop.sysnet.dao.ExeSqlDAO;import com.longtop.sysnet.utility.Page;public class EntityServiceImpl<T> implements EntityService<T> {
    private EntityDAO entityDao;
    public EntityDAO getEntityDao() {
    return entityDao;
    }// public UserAppsDetailsDao getDaoObj(){
    // return this.entityDao;
    // }

    // public ExeSqlDAO getSqlUtilObj(){
    // return this.sqlUtil;
    // }
    public void setEntityDao(EntityDAO entityDao) {
    this.entityDao = entityDao;
    }

    public Boolean delete(T paramModel) {
    Boolean success=false;
    if(this.entityDao.delete(paramModel)>0){
    success=true;
    }else{
    success=false;
    } return success;
    } public Boolean update(T paramModel) {
    Boolean success=false;
    if(this.entityDao.update(paramModel)>0){
    success=true;
    }else{
    success=false;
    }

    return success;
    }

    //插入操作返回主键
    public Object insert(T paramModel) {
    return this.entityDao.insert(paramModel);
    } public Page pageQuery(String pageName, Map param, int start, int limit) { Page page= this.entityDao.pagedQuery(param, start, limit);
    page.setPageName(pageName);

    return page;
    } public T selectOne(Map param) { return (T)this.entityDao.selectOne(param);
    }}
    package com.longtop.sysnet.service.entityservice;import java.util.Map;import com.longtop.sysnet.dao.ExeSqlDAO;
    import com.longtop.sysnet.dao.UserAppsDetailsDao;
    import com.longtop.sysnet.model.UserAppsDetails;
    import com.longtop.sysnet.utility.Page;public interface UserAppsDetailsService extends EntityService<UserAppsDetails> {

    }
    package com.longtop.sysnet.service.entityservice;import java.util.Map;import com.longtop.sysnet.dao.ExeSqlDAO;
    import com.longtop.sysnet.dao.UserAppsDetailsDao;
    import com.longtop.sysnet.dao.ibatis.IbatisEntityDao;
    import com.longtop.sysnet.model.UserAppsDetails;
    import com.longtop.sysnet.utility.Page;public class UserAppsDetailsServiceImpl extends EntityServiceImpl<UserAppsDetails> implements UserAppsDetailsService {    private UserAppsDetailsDao userAppsDetailsDao;   
    private ExeSqlDAO sqlUtil;

        public UserAppsDetailsDao getUserAppsDetailsDao() {   
            return userAppsDetailsDao;   
        }   
      
        public void setUserAppsDetailsDao(UserAppsDetailsDao userAppsDetailsDao) {   
            this.userAppsDetailsDao = userAppsDetailsDao;   
            super.setEntityDao(userAppsDetailsDao);   
        } public ExeSqlDAO getSqlUtil() {
    return sqlUtil;
    } public void setSqlUtil(ExeSqlDAO sqlUtil) {
    this.sqlUtil = sqlUtil;

    } <bean id="userAppsDetailsDao" class="com.longtop.sysnet.dao.ibatis.UserAppsDetailsDaoImpl"  >
            <constructor-arg>   
                <value>com.longtop.sysnet.model.UserAppsDetails</value>   
            </constructor-arg>  
    </bean> <bean id="userAppsDetailsService"  class="com.longtop.sysnet.service.entityservice.UserAppsDetailsServiceImpl" >
    <property name="entityDao" ref="userAppsDetailsDao"/> 
    <property name="sqlUtil" ref="exeSqlDao"/>
    </bean>
    <bean id="userAppsDetailsPageQueryAction" class="com.longtop.sysnet.controler.struts2.UserAppsDetailsAction">
    <property name="entityService" ref="userAppsDetailsService"/>
    </bean>
    请大家看看,我有哪些地方弄错了。试了n种办法都没成功,真是的