2012-10-09 34 views
2

我試圖與Spring3 MVC和Hibernate的應用程序,但有些事我做錯了,因爲每次我試圖做一個數據庫查詢我有這樣的錯誤:Spring3 MVC + Hibernate的錯誤

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here 
    org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63) 
    org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687) 
    com.ibex.pBaseSpring.repository.hibernate.HibernateUsuarioDAO.login(HibernateUsuarioDAO.java:25) 
    com.ibex.pBaseSpring.service.impl.UsuarioManagerImpl.login(UsuarioManagerImpl.java:23) 
    com.ibex.pBaseSpring.web.LoginController.login(LoginController.java:32) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:601) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:427) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:415) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:788) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:717) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 

我想我找到了,我仍然得到同樣的錯誤了所有的解決方案,這是我的代碼:

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

    <context:component-scan base-package="com.ibex.pBaseSpring.repository" /> 
    <context:component-scan base-package="com.ibex.pBaseSpring.service" /> 
    <context:component-scan base-package="com.ibex.pBaseSpring.web" /> 
    <context:annotation-config /> 
    <mvc:annotation-driven /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" 
      value="org.springframework.web.servlet.view.JstlView"></property> 
     <property name="prefix" value="/WEB-INF/views/"></property> 
     <property name="suffix" value=".jsp"></property> 
    </bean> 

    <context:property-placeholder location="/WEB-INF/spring/hibernate.properties" /> 

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName"> 
      <value>${hibernate.connection.driver_class}</value> 
     </property> 
     <property name="url"> 
      <value>${hibernate.connection.url}</value> 
     </property> 
     <property name="username"> 
      <value>${hibernate.connection.username}</value> 
     </property> 
     <property name="password"> 
      <value>${hibernate.connection.password}</value> 
     </property> 
    </bean> 

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

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

    <mvc:resources location="/resources/" mapping="/resources/**" /> 
</beans> 

的web.xml

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>pBaseSpring</display-name> 
    <servlet> 
    <servlet-name>pBaseSpring</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>pBaseSpring</servlet-name> 
    <url-pattern>/</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 
</web-app> 

的LoginController

package com.ibex.pBaseSpring.web; 

import javax.inject.Inject; 
import javax.servlet.http.HttpServletRequest; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 

import com.ibex.pBaseSpring.domain.Usuario; 
import com.ibex.pBaseSpring.service.UsuarioManager; 

@Controller 
public class LoginController { 

    private UsuarioManager usuarioManager; 

    @Inject 
    public LoginController(UsuarioManager usuarioManager){ 
     this.usuarioManager = usuarioManager; 
    } 

    @RequestMapping(value="/inicio") 
    public String inicio(){ 
     //comprobar que el usuario no esta registrado ya... 
     return "login"; 
    } 

    @RequestMapping(value="/login") 
    public String login(@RequestParam("login") String login, @RequestParam("pass") String pass){ 
     System.out.println(login + " - " + pass); 
     Usuario usuario = usuarioManager.login(login, pass); 
     return "main"; 
    } 

    @RequestMapping(value="/logout") 
    public String logout(){ 
     return "inicio"; 
    } 
} 

UsuarioManager

package com.ibex.pBaseSpring.service.impl; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Service; 
import com.ibex.pBaseSpring.domain.Usuario; 
import com.ibex.pBaseSpring.repository.UsuarioDAO; 
import com.ibex.pBaseSpring.service.UsuarioManager; 
@Service 
public class UsuarioManagerImpl implements UsuarioManager{ 

    @Autowired 
    private UsuarioDAO usuarioDAO; 
    public void setUsuarioDAO(UsuarioDAO usuarioDAO) { 
     this.usuarioDAO = usuarioDAO; 
    } 
    public Usuario login(String login, String pass) { 
     return usuarioDAO.login(login, pass); 
    } 
} 

HibernateUsuarioDAO

package com.ibex.pBaseSpring.repository.hibernate; 

import org.hibernate.Criteria; 
import org.hibernate.SessionFactory; 
import org.hibernate.criterion.Restrictions; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

import com.ibex.pBaseSpring.domain.Usuario; 
import com.ibex.pBaseSpring.repository.UsuarioDAO; 

@Repository 
public class HibernateUsuarioDAO implements UsuarioDAO{ 

    private SessionFactory sessionFactory; 

    @Autowired 
    public HibernateUsuarioDAO(SessionFactory sessionFactory){ 
     this.sessionFactory = sessionFactory; 
    } 

    @Transactional(readOnly = true) 
    public Usuario login(String login, String pass) { 
     Criteria c = sessionFactory.getCurrentSession().createCriteria(Usuario.class); 
     c.add(Restrictions.eq("login", login)); 
     c.add(Restrictions.eq("pass", pass)); 
     return (Usuario) c.uniqueResult(); 
    } 

} 

我有點絕望,謝謝你的幫助。再見!

回答

2

您沒有在您的bean中添加tx。這參考,bean標籤

<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:p="http://www.springframework.org/schema/p" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:util="http://www.springframework.org/schema/util" 
    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/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 
http://www.springframework.org/schema/util 
http://www.springframework.org/schema/util/spring-util-3.0.xsd 
"> 

,然後在您的應用程序-config.xml中加入這一行:

<tx:annotation-driven transaction-manager="transactionManager" /> 
+0

當我把這個我得到這個錯誤: 'org.springframework.beans.factory。 BeanCreationException:在ServletContext資源[/WEB-INF/spring/app-config.xml]中定義名稱爲'dataSource'的Bean時創建錯誤:Bean初始化失敗;' –

+0

'嵌套異常是java.lang.NoSuchMethodError:org.springframework。 core.annotation.AnnotationUtils.getAnnotation(Ljava /郎/反映/ AnnotatedElement中; Ljava /郎/類;)Ljava /郎/註解/ Annotatio n;' –

+0

確保你添加了同一版本的spring的所有jar文件。我認爲你有jar文件依賴關係的問題。 –

1

您錯過了<tx:annotation-driven />@Transactional沒有它將無法正常工作。

相關問題