K327
K327

Reputation: 318

Error creating bean in Spring Transaction Manager

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

Answers (2)

Xstian
Xstian

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

dReAmEr
dReAmEr

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

Related Questions