@Component("pagerManager")
public class PagerManager extends HibernateDaoSupport { .....
}@Component("orgManager")
public class OrgManagerImpl implements OrgManager { private HibernateTemplate hTemplate;
private PagerManager pagerManager;
        ......        @Resource(name = "pagerManager")
public void setPagerManager(PagerManager pagerManager) {
this.pagerManager = pagerManager;
}
        ......情况一:
 org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'pagerManager' is defined意味着:extends HibernateDaoSupport的类,不能由spring容器管理 。
我该怎么办!!情况二:
@Component("orgManager")
public class OrgManagerImpl extends PagerManager implements OrgManager {}
异常 需要我 注入 sessionFactory or hebernateTemplate 
情况三 :
@Component("orgManager")
public class OrgManagerImpl extends PagerManager implements OrgManager {
   
   @Resource(name = "hibernateTemplate")
public void sethTemplate(HibernateTemplate hTemplate) {
this.hTemplate = hTemplate;
}     .............
}
异常 需要我 注入 sessionFactory or hebernateTemplate 完整源码附件:package com.bjxst.oa.util;import java.util.List;import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Component;import com.bjsxt.oa.model.Organization;@Component("pagerManager")
public class PagerManager extends HibernateDaoSupport { /**
 * 
 * @param hql
 * @return 读取总数的语句
 */
private String getCountQuery(String hql) {
int index = hql.indexOf("from");
if (index != -1) {
return "select count(*)" + hql.substring(index);
}
throw new RuntimeException("无效的HQL语句!");
} public PagerModel searchPagerModel(String hql) {
return searchPagerModel(hql, null, SystemContext.getOffset(),
SystemContext.getPagersizes());
} /**
 * 返回一个页面模型
 * 
 * @param hql
 * @param params
 * @param offset
 * @param pagasizes
 * @return
 */
public PagerModel searchPagerModel(String hql, Object[] params, int offset,
int pagasizes) {
String CouQuery = getCountQuery(hql);
Query query = getSession().createQuery(CouQuery);
if (query != null && params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
int total = ((Long) query.uniqueResult()).intValue(); Query query1 = getSession().createQuery(hql);
if (query1 != null && params != null && params.length > 0) {
for (int i = 0; i < params.length; i++) {
query1.setParameter(i, params[i]);
}
}
query1.setFirstResult(offset);
query1.setMaxResults(pagasizes);
List<Organization> orgs = query1.list(); PagerModel pagerModel = new PagerModel();
pagerModel.setTotal(total);
pagerModel.setOrgs(orgs); return pagerModel;
}}
package com.bjsxt.oa.manager.impl;import javax.annotation.Resource;import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;import com.bjsxt.oa.manager.OrgManager;
import com.bjsxt.oa.model.Organization;
import com.bjxst.oa.util.PagerManager;
import com.bjxst.oa.util.PagerModel;@Component("orgManager")
public class OrgManagerImpl implements OrgManager { private HibernateTemplate hTemplate;
private PagerManager pagerManager; public PagerManager getPagerManager() {
return pagerManager;
} @Resource(name = "pagerManager")
public void setPagerManager(PagerManager pagerManager) {
this.pagerManager = pagerManager;
} public void addOrg(Organization org, int parentId) {
if (parentId != 0) {
org.setParent((Organization) hTemplate.load(Organization.class,
parentId));
}
hTemplate.save(org);
String sn = (org.getParent() == null ? ("" + org.getId()) : (org
.getParent().getSn()
+ "_" + org.getId()));
org.setSn(sn);
hTemplate.update(org);
} public void delOrg(int orgId) {
Organization org = (Organization) hTemplate.load(Organization.class,
orgId);
if (org == null) {
if (org.getChildren().size() > 0) {
throw new RuntimeException("存在子机构,不允许删除!");
}
} } public Organization findOrg(int orgId) {
Organization org = (Organization) hTemplate.load(Organization.class,
orgId);
return org;
} public HibernateTemplate gethTemplate() {
return hTemplate;
} public PagerModel searchOrgs(int parentId) {
if (parentId == 0) {
return pagerManager
.searchPagerModel("from Organization org where org.parent is null");
} return pagerManager
.searchPagerModel("from Organization org where org.parent.id = "
+ parentId); } @Resource(name = "hibernateTemplate")
public void sethTemplate(HibernateTemplate hTemplate) {
this.hTemplate = hTemplate;
} public void updateOrg(Organization org, int parentId) {
if (parentId != 0) {
org.setParent((Organization) hTemplate.load(Organization.class,
parentId));
}
hTemplate.update(org);
}}

解决方案 »

  1.   

    ..是否能将你的spring的配置文件贴出!你在spring中是否配置了<context:component-scan/>进行注解扫描,对于不是自己定义的类,在spring配置文件是否定义了对象,比如你的hibernateTemplate对象!
    @component是个比较大含义,你的三层分的够清晰的话,请使用 @Repository、@Service 和 @Controller 分别表示持久层,服务层和控制层
      

  2.   

    恩,可以的话,把spring的配置文件贴出来.不然这样都只能猜测,没意思了.
      

  3.   

    <?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:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               http://www.springframework.org/schema/aop
               http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
               http://www.springframework.org/schema/tx 
               http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    <context:annotation-config />
    <context:component-scan base-package="com.bjsxt" /> <bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="configLocation">
    <value>classpath:hibernate.cfg.xml</value>
    </property>
    </bean>
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <bean id="txManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
    </bean> <aop:config>
    <aop:pointcut id="bussinessService"
    expression="execution(public * com.bjsxt.oa.manager..*.*(..))" />
    <aop:advisor pointcut-ref="bussinessService" advice-ref="txAdvice" />
    </aop:config> <tx:advice id="txAdvice" transaction-manager="txManager">
    <tx:attributes>
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
    </tx:advice></beans>
      

  4.   

    详细异常:
    02:38:17,750 ERROR org.springframework.web.context.ContextLoader:215 - Context initialization failed
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'organizationAction': Injection of resource methods failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orgManager' defined in file [D:\apache-tomcat-6.0.26\webapps\my_oa_01\WEB-INF\classes\com\bjsxt\oa\manager\impl\OrgManagerImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:305)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:998)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:472)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:164)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:429)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:729)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:381)
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:255)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:199)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:45)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:546)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1041)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:964)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:502)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1277)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:321)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:519)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'orgManager' defined in file [D:\apache-tomcat-6.0.26\webapps\my_oa_01\WEB-INF\classes\com\bjsxt\oa\manager\impl\OrgManagerImpl.class]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1337)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:473)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory$1.run(AbstractAutowireCapableBeanFactory.java:409)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:380)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:264)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:221)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:261)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:435)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:409)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:537)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:192)
    at org.springframework.beans.factory.annotation.InjectionMetadata.injectMethods(InjectionMetadata.java:117)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:302)
    ... 40 more
    Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
    at org.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:117)
    at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1368)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1334)
    ... 55 more
      

  5.   

    找不到sessionFactory或者是HibernateTeplate。没办法注入到你的manager中.
    原因在于HibernateDaoSupport的setter方法前并没有加入@Resource这样的注解,并且它的所有bean方法都是不可改写的,这就相当于你的manager类和HibernateTemplate都被实例化,但manager实例并没有被注入HibernateTemplate.你可以重写一个HibernateDaoSupport 的替代类,然后在你的manager类中直接继承这个类【下面的HDSSuperDao】就Ok了.代码如下:  
    @Component
    public class HDSSuperDao extends HibernateDaoSupport{

       private HibernateTemplate hibernateTemplate;   
        public HibernateTemplate getHibernateTemplate() {   
            return hibernateTemplate;   
        }   
        @Resource   
       public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {   
           this.hibernateTemplate = hibernateTemplate;   
           }  
    }
      

  6.   

    第二种注入方法:
    在你的spring.xml中的hibernateTeplate可以不用定义.也就是
    <bean id="hibernateTemplate"  class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    可以把它去掉.然后写一个类继承HibernateDaoSuport,再注入sessionFacotry也可以,同样在你的manager也继承那个类【HDSSuperDao】就ok啦.代码如下:
    @Component
    public class HDSSuperDao extends HibernateDaoSupport{

    @Resource
    public void setSuperSessionFactory(SessionFactory sessionFactory){
    System.err.println("sessionFactory======== "+sessionFactory);
    super.setSessionFactory(sessionFactory);
    }}