Java Spring MVC-没有绑定到线程的Hibernate会话
我在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
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"/>