简体   繁体   English

集成Spring和Hibernate3。在创建bean时,应用程序引发异常

[英]Integrating Spring and Hibernate 3. Application throws exception when creating the beans

Good afternoon! 下午好! I'm starting studies with Dependency Injection and Inversion of Control with data persistence using the frameworks Spring and Hibernate. 我开始使用Spring和Hibernate框架进行依赖注入和具有数据持久性的控制反转的研究。 I'm trying to integrate the two using Spring to control the Hibernate SessionFactory for all components monitored by Spring can receive as dependence SessionFactory, Spring controlling everything.Unfortunately I am not able to accomplish this goal, I get the following exception: 我正在尝试使用Spring集成两者,以控制Spring监视的所有组件都可以作为依赖的SessionFactory来控制Hibernate SessionFactory,Spring控制一切。不幸的是我无法实现此目标,但收到以下异常:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'produtosController': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private br.com.caelum.estoque.dao.ProdutoDAO br.com.caelum.estoque.controller.ProdutosController.produtoDAO; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'produtoHibernateDAO' defined in file [C:\Program Files\eclipse\apache-tomcat-8.0.15\wtpwebapps\fj27-projeto-spring\WEB-INF\classes\br\com\caelum\estoque\dao\ProdutoHibernateDAO.class]: Unsatisfied dependency expressed through constructor argument with index 0 of type [org.hibernate.SessionFactory]: : Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/app-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/spring/app-config.xml]: Invocation of init method failed; nested exception is org.hibernate.HibernateException: Unable to instantiate default tuplizer [org.hibernate.tuple.entity.PojoEntityTuplizer]
org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:298)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1148)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458)
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293)
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290)
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191)
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:636)
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:934)
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:602)
org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:521)
org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:462)
org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
javax.servlet.GenericServlet.init(GenericServlet.java:158)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:745)

From what he says can not create the bean to the "SessionFactory" and thus can not create the beans for persistence of data, "DAOS". 从他所说的不能创建到“ SessionFactory”的bean,因此不能为持久化数据“ DAOS”创建bean。 I'm a week with this problem, I have seen and reviewed the settings in the app-config.xml, tried many things, I tried the forum but nothing I tried worked, now I'm asking for your help. 我有一个问题的一周时间,我已经查看并查看了app-config.xml中的设置,尝试了很多事情,尝试了论坛,但是没有任何尝试,现在,我正在寻求您的帮助。

Here are my project files: 这是我的项目文件:

ProdutosController ProdutosController

    package br.com.caelum.estoque.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import br.com.caelum.estoque.dao.ProdutoDAO;
import br.com.caelum.estoque.model.Produto;

@Controller
@RequestMapping(value = "produtos")
public class ProdutosController {

    @Autowired
    @Qualifier("produtoHibernateDAO")
    private ProdutoDAO produtoDAO;

    @RequestMapping(value = "index")
    public String index() {
        return "produtos/index";
    }

    @RequestMapping(value = "listar", method = RequestMethod.GET)
    public ModelAndView listar() {
        ModelAndView modelAndView = new ModelAndView("produtos/lista");
        modelAndView.addObject(produtoDAO.listar());
        return modelAndView;
    }

    @RequestMapping(value = "mostrar/{id}", method = RequestMethod.GET)
    public ModelAndView mostrar(@PathVariable Long id) {
        ModelAndView modelAndView = new ModelAndView("produtos/mostrar");
        modelAndView.addObject(produtoDAO.buscarPorId(id));
        return modelAndView;
    }

    @RequestMapping(value = "form")
    public String form() {
        return "produtos/form";
    }

    @RequestMapping(value = "salvar", method = RequestMethod.POST)
    public String salvar(Produto produto) {
        produtoDAO.salvar(produto);     
        return "redirect:/produtos/listar";
    }
}

ProdutoHibernateDAO ProdutoHibernateDAO

package br.com.caelum.estoque.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import br.com.caelum.estoque.model.Produto;

@Repository
public class ProdutoHibernateDAO implements ProdutoDAO {

    private Session session;

    @Autowired
    public ProdutoHibernateDAO(SessionFactory factory) {
        session = factory.openSession();
    }

    public void salvar(Produto produto) {
        session.save(produto);
    }

    public void alterar(Produto produto) {
        session.update(produto);
    }

    public List<Produto> listar() {
        List<Produto> produtos = session.createQuery("from Produto").list();
        return produtos;
    }

    public Produto buscarPorId(Long id) {
        return (Produto) session.get(Produto.class, id);
    }
}

ProdutoDAO ProdutoDAO

package br.com.caelum.estoque.dao;

import java.util.List;

import br.com.caelum.estoque.model.Produto;

public interface ProdutoDAO {

    void salvar(Produto produto);
    void alterar(Produto produto);
    List<Produto> listar();
    Produto buscarPorId(Long id);
}

Produto Produto

package br.com.caelum.estoque.model;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Produto {

    @Id
    @GeneratedValue
    private Long id;
    private String descricao;
    private Integer quantidade;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Integer getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }
}

app-config.xml APP-config.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:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">


    <!-- Configura aonde o Spring deve buscar por beans anotados -->
    <context:component-scan base-package="br.com.caelum.estoque" />

    <!-- Habilitar suporte a anotação @Controller -->
    <mvc:annotation-driven />

    <!-- Factory Bean para a SessionFactory do Hibernate. Utilizando esta factory 
        fazemos com que a SessionFactory do hibernate seja gerenciada pelo Spring. -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost/fj21" />
        <property name="username" value="root" />
        <property name="password" value="m19731973f" />
    </bean>

    <!-- Configuração das propriedades do Hibernate -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" value="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.connection.url">jdbc:mysql://localhost/fj21</prop>
                <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                <prop key="hibernate.connection.username">root</prop>
                <prop key="hibernate.connection.password">m19731973f</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.connection.autocommit">true</prop>
            </props>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>br.com.caelum.estoque.model.Produto</value>
            </list>
        </property>
    </bean>

</beans>

web.xml web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
          http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id="WebApp_ID" version="2.5">

    <display-name>FJ27 Estoque</display-name>

    <!-- Configura o Spring Servlet -->
    <servlet>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>
                    /WEB-INF/spring/app-config.xml
                </param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


</web-app>

aplicationContext.xml aplicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

</beans>

I tried to change the constructor method like this 我试图像这样更改构造方法

@Autowired
public ProdutoHibernateDAO(SessionFactory factory) {
    session = factory.getCurrentSession();
}

and methods 和方法

public void salvar(Produto produto) {
    session.getSessionFactory().getCurrentSession().save(produto);
}

The jars both spring and hibernate are in version 4. 春季和冬眠的罐子都在版本4中。

I solved the problem. 我解决了问题。 I changed both the jarss Spring as the Hibernate to version 4 (spring 4.1.4.RELEASE, hibernate 4.3.8.Final). 我将两个jars Spring都更改为Hibernate版本(Spring 4.1.4.RELEASE,Hibernate 4.3.8.Final)。 So I changed my app-config.xml file and let him thus: 因此,我更改了app-config.xml文件,并让他这样做:

<!-- Configuração das propriedades do Hibernate -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.connection.url">jdbc:mysql://localhost/fj21</prop>
                <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                <prop key="hibernate.connection.username">root</prop>
                <prop key="hibernate.connection.password">m19731973f</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.connection.autocommit">true</prop>
            </props>
        </property>
        <property name="annotatedClasses">
            <list>
                <value>br.com.caelum.estoque.model.Produto</value>
            </list>
        </property>
    </bean>

I think there should be a version conflict of jars. 我认为应该存在jar版本冲突。 Now is working perfectly. 现在工作正常。 Thanks for everyone's help. 感谢大家的帮助。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM