最近开始学习spring mvc 使用注解遇到问题,用于操作数据库的DAO取值为空,请教各位前辈。
先贴上我的代码
springmvc-servelt.xml
<!-- 自动扫描bean,把作了注解的类转换为bean -->
<context:component-scan base-package="com.moran.demo.test.controller.impl" /> <!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean
class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <!--对模型视图名称的解析,在请求时模型视图名称添加前后缀 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/views/" p:suffix=".jsp" /> <bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="utf-8" />applicationContext.xml:<context:annotation-config />
<context:component-scan base-package="com.moran.demo.test" />
<context:component-scan base-package="com.moran.demo.test.manager" />
<context:component-scan base-package="com.moran.demo.test.dao" />
<context:component-scan base-package="com.moran.demo.test.dao.impl" />
<context:component-scan base-package="com.moran.demo.test.controller" />
<context:component-scan base-package="com.moran.demo.test.controller.impl" />
<!-- 配置连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.microsoft.jdbc.sqlserver.SQLServerDriver">
</property>
<property name="url"
value="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=demo">
</property>
<property name="username" value="sa"></property>
<property name="password" value="1234"></property>
</bean>
<!-- 配置sessionfactoty 可以自动完成 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect"> org.hibernate.dialect.SQLServerDialect </prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="packagesToScan">
<list>
<value>com.moran.demo.test.pojo</value>
</list>
</property>
</bean>
<!-- 配置HibernateTemplate,用于完成数据操作 -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean> <!--配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="modify*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" read-only="true" />
</tx:attributes>
</tx:advice> <!--那些类的哪些方法参与事务 -->
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.moran.demo.*.*.*(..))" />
<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" />
</aop:config>
IBaseDao.java接口public interface IBaseDao<T, PK> {

public abstract boolean deleteAll(final T t); public abstract boolean deleteById(final Class<T> entityClass, final PK id); public abstract List<T> findAll(final Class<T> entityClass); public abstract T findById(final Class<T> entityClass, final PK id); public abstract boolean save(final T t); public abstract boolean update(final T t);
}BaseSupportDao.java:public class BaseSupportDao extends HibernateDaoSupport {
@Resource(name = "hibernateTemplate")
public void setHibernatetemplate(HibernateTemplate hibernateTemplate) {
super.setHibernateTemplate(hibernateTemplate);
}
}
BaseDaoImpl.java@Repository("basicDao")
public class BaseDaoImpl<T, PK extends Serializable> extends BaseSupportDao
implements IBaseDao<T, PK> {
public boolean deleteAll(final T t) {
getHibernateTemplate().deleteAll(this.findAll((Class<T>) t.getClass()));
return true;
} public boolean deleteById(final Class<T> entityClass, final PK id) {
getHibernateTemplate().delete(this.findById(entityClass, id));
return true;
} public List<T> findAll(final Class<T> entityClass) {
return getHibernateTemplate().findByCriteria(
DetachedCriteria.forClass(entityClass));
} public T findById(final Class<T> entityClass, final PK id) {
return (T) getHibernateTemplate().get(entityClass, id);
} public boolean save(final T t) {
getHibernateTemplate().save(t);
return true;
} public boolean update(final T t) {
getHibernateTemplate().update(t);
return true;
}

}
UserDao.java@Service
public class UserDao extends BaseDaoImpl<UserInfo, Integer> {}
UserController.java
@Controller
public class UserController extends BaseDaoImpl<UserInfo, Integer> {


private UserDao userDao ;
/**
 * @param userDao the userDao to set
 */
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@RequestMapping(value = "/user/getall", method = RequestMethod.GET)
public ModelAndView getALL() {
ModelAndView mav = new ModelAndView("/test/user/list");
System.out.println("userDao===" + userDao);
// List<UserInfo> list = userDao.findAll(UserInfo.class);
// mav.addObject("list", list);
return mav;
}
}这是我的代码,因为不知道为题出在哪,所以贴的比较多,见谅。在最后请求UserController的时候 userDao为空,麻烦各位帮忙,是配置文件有问题吗?

解决方案 »

  1.   

    配置文件怎么没见你有userDao的配置
      

  2.   

    你那个dao是不是没有交给spring管理!
      

  3.   


    配置了<!--那些类的哪些方法参与事务 -->
    <aop:config proxy-target-class="true">
    <aop:pointcut id="allManagerMethod"
    expression="execution(* com.moran.demo.test.manager..*.*(..))" />
    <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice" />
    </aop:config>
    这是我后来修改的,把dao改为manager了,其他没变,在controller中怎么获取呢。我写了个测试类,代码如下public class UserTestController {
    public static void main(String[] args) {  
            UserTest usertest = new UserTest();  
            usertest.setName("李四"); 
            usertest.setAge(47);
              
            BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");  
            UserManager userManager = (UserManager) factory.getBean(UserManager.class);  
            try {  
                userManager.addUser(usertest);  
            } catch (Exception e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
    }
    这样可以取的到,也可以修改数据库数据。
      

  4.   


    现在的问题是  private UserManager userManager ; /**
     * @param userManager the userManager to set
     */
    public void setUserManager(UserManager userManager) {
    this.userManager = userManager;
    }
    在controller中,这样写usermanager,是null,怎么样才能取到值。
      

  5.   

    我想问几点:
    1、
    @Service
    public class UserDao extends BaseDaoImpl<UserInfo, Integer> {}这个是Dao你为什么用@Service2、
    @Controller
    public class UserController extends BaseDaoImpl<UserInfo, Integer> {
        
       
    }@Controller 应该是用在Action的吧
    3、public class UserController extends BaseDaoImpl<UserInfo, Integer> {
        
        
        private UserDao userDao ;这里的userDao你怎么没有注入;应该是:
    @Resource
    private UserDao userDao ;这是我个人的怀疑的地方,希望共同学习
      

  6.   


    首先感谢你的回复,解决了困扰了我好几天的问题,问题就出在你的第三个疑问中,按你的方法就可以了。就是 
    @Resource
    private UserDao userDao ;
    接下来说说我对你前两个疑问的理解。Spring 2.5 在 @Repository 的基础上增加了功能类似的额外三个注解:@Component、@Service、@Constroller,它们分别用于软件系统的不同层次:
    @Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
    @Service 通常作用在业务层,但是目前该功能与 @Component 相同。
    @Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
    这是三个注释的解释,后来我改了代码,只保留了controller和manager(把userDao改为了userManager)controller控制转发,manager负责处理业务逻辑和持久化处理。所以就这样写了。