Reputation: 318
hi every body im creating a web app with Spring-MVc and hibernate and Spring Transaction
when i add @Repository to my class it make error: the error is :
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'numberGeneratorImpl' defined in file [E:\JAVA\BankEE\out\artifacts\BankEE_war_exploded\WEB-INF\classes\model\bl\NumberGeneratorImpl.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:1513)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:521)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:633)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:602)
at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:521)
at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:462)
at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
at javax.servlet.GenericServlet.init(GenericServlet.java:160)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1216)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1135)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4957)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5284)
at org.apache.catalina.core.StandardContext$3.call(StandardContext.java:5279)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.IllegalArgumentException: 'sessionFactory' or 'hibernateTemplate' is required
at org.springframework.orm.hibernate3.support.HibernateDaoSupport.checkDaoConfig(HibernateDaoSupport.java:123)
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1572)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean
now i gonna show you my app classes and interface:
this is INumberGenerator Interface:
public interface INumberGenerator {
public String returnNumber();
}
this is NumberGeneratorImpl(in this class because of @Repository give me ERROR):
@Repository
public class NumberGeneratorImpl extends HibernateDaoSupport implements INumberGenerator {
@Override
@Transactional
public String returnNumber() {
List<String> list = getHibernateTemplate().find("select n.number from NumberGenerator n ");
Integer newNumber = Integer.parseInt(list.get(0))+1;
getHibernateTemplate().bulkUpdate("update NumberGenerator n set n.number=?",newNumber.toString());
return list.get(0);
}
}
and this is my controller(Spring-mvc):
@Controller
public class MainController {
@Autowired
INumberGenerator numberGenerator;
@RequestMapping(//something)
public String test(//request and response)
{
numberGenerator.returnNumber();
}
at the end this is my mvc-dispatcher-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
"default-autowire="byName">
<mvc:annotation-driven/>
<tx:annotation-driven />
<context:annotation-config />
<context:component-scan base-package="model.bl"/>
<context:component-scan base-package="controller"/>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
</bean>
<bean id="driverManagerDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/bankee"/>
<property name="username" value="root"/>
<property name="password" value="myjava123"/>
</bean>
<bean id="localSessionFactoryBean" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="driverManagerDataSource"/>
<property name="mappingResources">
<list>
//hbm definitions
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
</bean>
<bean id="numberGenerator" class="model.bl.NumberGeneratorImpl">
<property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="localSessionFactoryBean" />
</bean>
</beans>
can anybody tell me what is the problem that @Repository makes??? the error will gone when i delete @Repository
Upvotes: 2
Views: 2844
Reputation: 8282
You have a component-scan
that retrieve all @Repository, indeed the problem is for the bean "numberGeneratorImpl" that you haven't in your spring context. You must exclude it form component scan else you have 2 bean of NumberGeneratorImpl.class
numberGeneratorImpl
numberGenerator
You've two way..
First solution
add in your context
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>
remove below declaration
<bean id="numberGenerator" class="model.bl.NumberGeneratorImpl">
<property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>
and modify
@Repository
@Qualifier("numberGenerator")
public class NumberGeneratorImpl extends HibernateDaoSupport implements INumberGenerator {
Second solution
Exclude the class from component-scan
<context:component-scan base-package="model.bl">
<!--other filters-->
<!--.......-->
<context:exclude-filter expression="model\.bl\.NumberGeneratorImpl" type="regex" />
</context:component-scan>
I hope that it was helpful.
In adding .. the bean hibernateTemplate
is not real necessary, when you use HibernateDaoSupport only one of sessionFactory
or hibernateTemplate
is required. You could also make an alias for your localSessionFactoryBean
.
<alias name="localSessionFactoryBean" alias="sessionFactory" />
Upvotes: 1
Reputation: 7196
I think below line is missed in your mvc-dispatcher-servlet.xml file.
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="localSessionFactoryBean"/>
</bean>
Upvotes: 2