Нет доступного компонента с именем ‘TransactionManager’:

#java #spring #spring-boot #hibernate #spring-mvc

#java #весна #весенняя загрузка #спящий режим #spring-mvc

Вопрос:

Сбой обработки запроса; вложенным исключением является org.springframework.beans.factory.Исключение NoSuchBeanDefinitionException: нет доступного компонента с именем ‘TransactionManager’: не найден соответствующий компонент TransactionManager для квалификатора ‘TransactionManager’ — ни совпадение квалификатора, ни совпадение имени компонента!

CustomerDAOImpl.java

 package com.shadow.springdemo.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.query.Query;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.shadow.springdemo.entity.Customer;

@Repository
public class CustomerDAOImpl implements CustomerDAO {

// need to inject the session factory
@Autowired
private SessionFactory sessionFactory;
        
@Override
@Transactional
public List<Customer> getCustomers() {
    
    // get the current hibernate session
    Session currentSession = sessionFactory.getCurrentSession();
            
    // create a query
    Query<Customer> theQuery = 
            currentSession.createQuery("from Customer", Customer.class);
    
    // execute query and get result list
    List<Customer> customers = theQuery.getResultList();
            
    // return the results       
    return customers;
}

}
  

CustomerController

         package com.shadow.springdemo.controller;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    import com.shadow.springdemo.dao.CustomerDAO;
    import com.shadow.springdemo.entity.Customer;
    
    @Controller
    @RequestMapping("/customer")
    public class CustomerController {
        
        // need to inject the customer dao
        @Autowired(required = true)
        private CustomerDAO customerDAO;
        
        @RequestMapping("/list")
        public String listcustomer(Model theModel) {
            
            //get customer from dao
            List<Customer> theCustomers  = customerDAO.getCustomers();
            
            //add customer to model
            theModel.addAttribute("customers", theCustomers);
            
            return "list-customer";
        }
    }
  

CustomerDAO

         package com.shadow.springdemo.dao;
    
    import java.util.List;
    
    import com.shadow.springdemo.entity.Customer;
    
    public interface CustomerDAO {
        
        public List<Customer> getCustomers();
    }
  

spring-mvc-crud-demo-servlet.xml

             <?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:tx="http://www.springframework.org/schema/tx"
            xmlns:mvc="http://www.springframework.org/schema/mvc"
            xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-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/context 
          http://www.springframework.org/schema/context/spring-context-2.5.xsd
          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
        
            <!-- Add support for component scanning -->
            <context:component-scan base-package="com.shadow.springdemo" />
        
            <!-- Add support for conversion, formatting and validation support -->
            <tx:annotation-driven/>
        
            <!-- Define Spring MVC view resolver -->
            <bean
                class="org.springframework.web.servlet.view.InternalResourceViewResolver">
                <property name="prefix" value="/WEB-INF/view/" />
                <property name="suffix" value=".jsp" />
            </bean>
        
            <!-- Step 1: Define Database DataSource / connection pool -->
            <bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
                  destroy-method="close">
                <property name="driverClass" value="com.mysql.cj.jdbc.Driver" />
                <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=falseamp;amp;serverTimezone=UTC" />
                <property name="user" value="student" />
                <property name="password" value="student" /> 
        
                <!-- these are connection pool properties for C3P0 -->
                <property name="minPoolSize" value="5" />
                <property name="maxPoolSize" value="20" />
                <property name="maxIdleTime" value="30000" />
            </bean>  
            
            <!-- Step 2: Setup Hibernate session factory -->
            <bean id="sessionFactory"
                class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
                <property name="dataSource" ref="myDataSource" />
                <property name="packagesToScan" value="com.shadow.springdemo.entity" />
                <property name="hibernateProperties">
                   <props>
                      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                      <prop key="hibernate.show_sql">true</prop>
                   </props>
                </property>
           </bean>    
        
            <!-- Step 3: Setup Hibernate transaction manager -->
            <bean id="myTransactionManager"
                    class="org.springframework.orm.hibernate5.HibernateTransactionManager">
                <property name="sessionFactory" ref="sessionFactory"/>
            </bean>
            
            <!-- Step 4: Enable configuration of transactional behavior based on annotations -->
            <tx:annotation-driven transaction-manager="myTransactionManager" />
        
        </beans>
        
  

Web.xml

             <?xml version="1.0" encoding="UTF-8"?>
        <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
          <display-name>spring-mvc-crud-demo</display-name>
        
          <absolute-ordering />
        
          <welcome-file-list>
            <welcome-file>index.jsp</welcome-file>
            <welcome-file>index.html</welcome-file>
          </welcome-file-list>
        
          <servlet>
            <servlet-name>dispatcher</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>/WEB-INF/spring-mvc-crud-demo-servlet.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
          </servlet>
          
          <servlet-mapping>
            <servlet-name>dispatcher</servlet-name>
            <url-pattern>/</url-pattern>
          </servlet-mapping>
        </web-app>
  

Комментарии:

1. опубликовал ответ, посмотрите, поможет ли это.

Ответ №1:

ссылка на весенний документ

Небольшое различие между двумя примерами заключается в именовании компонента TransactionManager: в случае @Bean имя — «txManager» (согласно имени метода); в случае XML имя — «TransactionManager». <tx:annotation-driven/> жестко настроен для поиска компонента с именем «TransactionManager»

следовательно, в ur xml переименуйте компонент myTransaction в TransactionManager

         <bean id="transactionManager"
                class="org.springframework.orm.hibernate5.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
        
        <!-- Step 4: Enable configuration of transactional behavior based on annotations -->
        <tx:annotation-driven transaction-manager="transactionManager" />