@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);
}}
@component是个比较大含义,你的三层分的够清晰的话,请使用 @Repository、@Service 和 @Controller 分别表示持久层,服务层和控制层
<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>
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
原因在于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;
}
}
在你的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);
}}