【问题标题】:NoSuchBeanDefinitionException with Spring and HibernateNoSuchBeanDefinitionException 与 Spring 和 Hibernate
【发布时间】:2014-03-21 18:34:49
【问题描述】:

我正在尝试做“Spring in action 3”中的示例。但是有这个问题,不明白为什么。 我有下一节课: 我的实体:

package core;

import javax.persistence.*;

import org.hibernate.annotations.GenericGenerator;

@Entity
@Table(name="users")
public class SplitterImpl{

    @Id
    @GeneratedValue(generator="increment")
    @GenericGenerator(name="increment", strategy="increment")
    @Column(name="id")
    private int id;
    @Column(name="name")
    private String name;
    @Column(name="password")
    private String password;
    @Column(name="fullname")
    private String fullname;
    @Column(name="email")
    private String email;
    @Column(name="updatebyemail")
    private String updatebyemail;

    //****************
    //public Setters/getters
    //****************
}

我的 DAO:

package core;

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

@Repository
public class HibernateSplitterDao implements SplitterDAO {
    @Autowired
    private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {
        return sessionFactory;
    }

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    @Override
    public void addSplitter(SplitterImpl splitter) {
        sessionFactory.getCurrentSession().persist(splitter);       
    }   
}

我的主要课程:

package core;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static String getBean(){
        ApplicationContext ctx=new ClassPathXmlApplicationContext("core\\spring.xml");

        return ctx.getBean(HibernateSplitterDao.class).toString();
    }
}

在 xml spring 配置中我是这样写的:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:jee="http://www.springframework.org/schema/jee"
        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.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/jee
        http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

    <context:annotation-config/>
    <context:component-scan base-package="core"></context:component-scan>

    <jee:jndi-lookup id="dataSource" 
    jndi-name="jdbc/splitter"/> 


    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>


    <bean id="Splitter"
            class="core.SplitterImpl">
        <property name="name" value="TGSH"/>
        <property name="password" value="ua"/>
        <property name="fullname" value="Taras Shevchenko"/>
        <property name="email" value="tgsh@gmail.com"/>
        <property name="updatebyemail" value="false" />
    </bean>

    <bean id="sessionFactory"
            class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan" value="core"/>
        <property name="hibernateProperties">
            <props>
                <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
            </props>
        </property>
    </bean>         

    <bean id="dao"  class="core.HibernateSplitterDao">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

</beans>

当我尝试再买一些豆子时,一切都好。但是当我尝试获取 HibernateSplitterDao bean 时,我遇到了这样的问题:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [core.HibernateSplitterDao] is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:318)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:985)
at core.Main.getBean(Main.java:10)
at org.apache.jsp.index_jsp._jspService(index_jsp.java:68)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
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:744)

附:对不起我的英语。

【问题讨论】:

    标签: java spring hibernate exception


    【解决方案1】:

    在 Spring xml 中,引用 Impl 类而不是 Interface。

     <bean id="dao"  class="core.HibernateSplitterDaoImpl">
            <property name="sessionFactory" ref="sessionFactory"/>
        </bean>
    

    清理项目并再次运行。

    【讨论】:

    • 谢谢,尝试从项目中删除 SplitterDao(接口)。现在是工作。但是现在我有另一个问题)当尝试调用方法'addSpliter'时得到它:org.hibernate.HibernateException:没有Hibernate Session绑定到线程,并且配置不允许在这里创建非事务性的
    • 您可以将事务传播添加为强制。只需将@Transactional(propagation = Propagation.MANDATORY) 放到DAO方法中
    • 非常感谢大家的帮助。所有的问题都解决了。最后一个问题通过添加 @Transaction 到 addSplitter 方法和一些 xml 代码来解决:
    • 使用 不需要在 xml btw 中定义任何 bean
    【解决方案2】:

    您正在尝试获取 SplitterDAO 类型的 bean,但您尚未定义任何该类。我在拆分器中看到的只是core.SplitterImpl。尝试创建一个 core.SplitterImpl 类型的 bean。

    【讨论】:

    • SplitterDAO 是一种方法的接口,它在 HibernateSplitterDao 中实现。
    • 错过了,抱歉。 :)
    【解决方案3】:

    &lt;context:annotation-config&gt; 用于在已注册的 bean 上启用注释。(例如 @Autowired

    &lt;context:component-scan&gt; 更进一步,扫描并在上下文中注册 bean。 (例如@Repository

    看起来 SplitterDao 没有注册(不在 xml 中或不使用组件扫描)

    【讨论】:

    • 我添加了 但问题依然存在
    • 即使我手动注册HibernateSplitterDAO 并尝试按名称获取它,我也明白了。但是当尝试将对象转换为HibernateSplitterDAO 时:java.lang.ClassCastException: com.sun.proxy.$Proxy16 cannot be cast to core.HibernateSplitterDao at core.Main.getBean(Main.java:10) ....
    • 你能展示你的整个 xml spring 配置和你提到的一些代码吗?
    • 添加有问题的完整 xml。
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2019-11-14
    • 2018-01-22
    • 2016-12-06
    • 2013-10-02
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多