Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC-没有绑定到线程的Hibernate会话_Java_Spring_Hibernate_Spring Mvc - Fatal编程技术网

Java Spring MVC-没有绑定到线程的Hibernate会话

Java Spring MVC-没有绑定到线程的Hibernate会话,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我在hibernate中的会话有问题: INFO: Starting ProtocolHandler ["http-bio-8080"] 2013-09-10 16:23:11 org.apache.catalina.startup.Catalina start INFO: Server startup in 4000 ms 2013-09-10 16:23:13 org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Serv

我在hibernate中的会话有问题:

INFO: Starting ProtocolHandler ["http-bio-8080"]
2013-09-10 16:23:11 org.apache.catalina.startup.Catalina start
 INFO: Server startup in 4000 ms
2013-09-10 16:23:13 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/portal] threw          exception [Request processing failed; nested exception is org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here] with root cause
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
    at com.myportal.portal.model.HibernateDao.getSessionFactory(HibernateDao.java:31)
    at com.myportal.portal.model.HibernateDao.testowa(HibernateDao.java:46)
    at com.myportal.portal.controllers.HomeController.home(HomeController.java:35)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
我读过一些关于这个问题的文章,但解决方案在我的案例中不起作用

我的刀类:

package com.myportal.portal.model;
import org.hibernate.classic.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.myportal.portal.entity.User;

@Repository
@Transactional(propagation=Propagation.REQUIRED)
public class HibernateDao {
    @Autowired
    private SessionFactory sessionFactory;


    public HibernateDao()
    {

    }
    public HibernateDao(SessionFactory sessionFactory)
    {
        this.sessionFactory = sessionFactory;
    }
    private Session getSessionFactory()
    {
        return sessionFactory.getCurrentSession();
    }

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

    public void testowa()
    {
        User u = new User();
        //SessionFactory sf = getSessionFactory();
        //Session s = sf.openSession().beginTransaction()

        // problem with this
        Session session = getSessionFactory();
        //session.save(u);

    }
}
root-context.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:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- Root Context: defines shared resources visible to all other web components -->


<context:annotation-config/>
<tx:annotation-driven transaction-manager="transactionManager"/>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost/hibernate1"/>
    <property name="username" value="root2"/>
    <property name="password" value=""/>
    <property name="initialSize" value="5"/>
    <property name="maxActive" value="10"/>
</bean>    

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="dataSource" ref="dataSource"/>
   <property name="packagesToScan" value="com.spoleczniak.projekt.model"/>
   <property name="hibernateProperties">
       <props>
           <prop key="dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
           <prop key="show_sql">true</prop>
       </props>
   </property>
</bean>

    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

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

</beans>
    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->

    <!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
    <context:annotation-config/>
<context:component-scan base-package="com.myportal.portal" />

    <!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
    <resources mapping="/resources/**" location="/resources/" />

    <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
我怎样才能修好它

我更改了DAO并创建了UserService,但仍然出现错误:

道:

用户服务:

@Service
public class UserService {

    @Autowired
    private HibernateDao hibernateDao;


    @Transactional
    public void addContact() 
    {
        hibernateDao.testowa(); 
    }
}
控制器:

@Controller
public class RegisterController {

    @Autowired
    private UserService userService;

    @RequestMapping(value="/register")
    public String registerForm()
    {
        userService.addContact();
        return "register";
    }
}
这意味着该线程中没有当前事务

正如您纠正我的那样,该类用@Transactional注释,但我发现它没有实现接口。可能会发生这样的情况,即生成的代理不会公开注释,就像在没有实现接口的情况下对控制器进行注释一样


.xml

发生的是您的
servlet上下文。xml
正在覆盖
根上下文中的bean。xml
因为它正在为包含
@Repository
类的包声明
组件扫描。在
servlet context.xml
中,您有

<context:component-scan base-package="com.myportal.portal" />
添加到
根上下文.xml
并删除
(这是多余的)。然后,您需要将
servlet context.xml
中的
组件扫描
修改为不包含
@Repository
类包的更具体的内容

<context:component-scan base-package="com.myportal.portal.controllers" />


该包将包含您的
@Controller
类。在bean实例化
servlet上下文期间,您也不需要

。读取xml
,并实例化带有
@Controller
@Service
@Repository
的bean

现在,当读取
application context.xml
(具有
)时,bean已经存在,因此不会获得事务行为。使
servlet context.xml
中的包特定于类UI控制器/或从组件扫描中排除服务、存储库包

<context:component-scan base-package="com.java.controllers"/> 


看起来您为servlet-context.xml发布的内容与为root-context.xml发布的内容相同。这是一个错误,对吗?对不起,我在这篇文章中犯了错误。我更正了这篇文章。哦,对了,没有完全阅读代码。但是我现在检查了DAO对象是否没有实现接口。可能生成的代理没有在运行时公开注释。初始化步骤会抱怨类路径中是否缺少CGLIB。这不像CGLIB不存在,但是CGLIB创建子类来创建代理,并且子类不保留注释如果您没有用@inherited注释注释,代理不需要注释,它是因为注释而生成的。代理只是有功能。好的,我更改了它。现在我在创建BER时遇到问题:创建文件[I:\Spring\vfabric-tc-server-developer-2.8.1.RELEASE\base instance\wtpwebapps\portalSpol\WEB-INF\classes\com\myportal\portal\model\hibernateDao.class]中定义的名为“hibernateDao”的bean时出错:bean初始化失败;嵌套的异常是java.lang.NoClassDefFoundError:org/objectweb/asm/util/TraceClassVisitorI添加了asm和cglib依赖项,此错误消失。现在,在名为“appServlet”的DispatcherServlet中找不到URI为[/portal/]的HTTP请求的映射。所以我认为这并没有看到我的控制器(控制器在这个包中)。在修改之前,它工作得很好。好的,现在它工作得很好。谢谢你的帮助,你的建议对我很有帮助。
<context:component-scan base-package="com.myportal.portal" />
<context:component-scan base-package="com.myportal.portal.model" />
<context:component-scan base-package="com.myportal.portal.controllers" />
<context:component-scan base-package="com.java.controllers"/>