2016-10-17 5 views
1

Я хочу сделать запрос POST, чтобы сохранить пользователя в моей базе данных Oracle.Spring MVC Hibernate No EntityManager с реальной транзакцией, доступной для текущего потока - не может надежно обработать вызов «persist»

Я использую Spring MVC с jpa и спящим.

Вот мой jpaContext.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/context http://www.springframework.org/schema/context/spring-context-4.3.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd"> 

    <context:annotation-config /> 
    <context:component-scan base-package="com.licenta.ascourses" /> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />  

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="persistenceUnitName" value="punit" /> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="true" /> 
      </bean>    
     </property> 
     <property name="jpaPropertyMap"> 
      <map> 
       <entry key="hibernate.dialect"  value="org.hibernate.dialect.Oracle8iDialect" /> 
       <entry key="hibernate.hbm2ddl.auto" value="create-drop" /> 
       <entry key="hibernate.format_sql" value="true" /> 
      </map> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    </bean> 

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

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> 
     <property name="url"    value="jdbc:oracle:thin:@localhost:oracle" /> 
     <property name="username"  value="user" /> 
     <property name="password"  value="pass" /> 
    </bean> 

</beans> 

Вот мой UserRepoImpl класс:

package com.licenta.ascourses.repositories.jpa; 

import java.util.List; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.persistence.PersistenceContextType; 

import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 

import com.licenta.ascourses.model.User; 
import com.licenta.ascourses.repositories.UserRepo; 

@Repository("userRepository") 
public class JpaUserRepo implements UserRepo { 

    @PersistenceContext(type=PersistenceContextType.EXTENDED) 
    private EntityManager em; 

    public User getUserById(Long id) { 
     return em.find (User.class, id); 
    } 

    public List<User> getAllUsers() { 
     return null; 
    } 

    public User createUser(User user) { 
     em.persist(user); 
     em.flush(); 

     return user; 
    } 
} 

И это класс UserServiceImpl:

package com.licenta.ascourses.service; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Scope; 
import org.springframework.context.annotation.ScopedProxyMode; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Propagation; 
import org.springframework.transaction.annotation.Transactional; 

import com.licenta.ascourses.model.User; 
import com.licenta.ascourses.repositories.UserRepo; 
import com.licenta.ascourses.repositories.jpa.JpaUserRepo; 


@Service("userService") 
public class UserServiceImpl implements UserService { 

    @Autowired 
    private UserRepo userRepo; 

    public User getUserById(Long id) { 
     return userRepo.getUserById(id); 
    } 

    public List<User> getAllUsers() { 
     return userRepo.getAllUsers(); 
    } 

    @Transactional 
    public User createUser(User user) { 
     return userRepo.createUser (user); 
    } 
} 

Это метод от контроллера REST:

@Autowired 
private UserService userService; 

@RequestMapping(method=RequestMethod.POST, consumes=MediaType.APPLICATION_JSON_UTF8_VALUE) 
public User saveUser (@RequestBody User user) { 
    return userService.createUser(user);   
}   

У меня есть аннотация «@Transactional» на моем сервисном уровне. Я пробовал множество решений, найденных в Интернете, используя @Transactional на уровне репозитория, или используйте @Scope (proxyMode = ScopedProxyMode.INTERFACES) для репозитория или классов обслуживания. Ничто не сработало для меня. Я новичок в Spring и Hibernate, поэтому все ответы или предложения хорошо приветствовали

Это исключение я получаю при попытке сделать POST:

PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [ascoursesServlet] in context with path [/ASCourses] threw exception [Request processing failed; nested exception is javax.persistence.TransactionRequiredException: no transaction is in progress] with root cause 
javax.persistence.TransactionRequiredException: no transaction is in progress 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1136) 
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1297) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:347) 
    at com.sun.proxy.$Proxy24.flush(Unknown Source) 
    at com.licenta.ascourses.repositories.jpa.JpaUserRepo.createUser(JpaUserRepo.java:32) 
    at com.licenta.ascourses.service.UserServiceImpl.createUser(UserServiceImpl.java:33) 
    at com.licenta.ascourses.controller.TestController.saveUser(TestController.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:95) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1153) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:785) 
+0

, что это ошибка, которую вы получаете? –

+0

@BurakKeceli, я обновил вопрос –

+0

Я пробовал этот код с базой данных MYSQL (с несколькими изменениями в jpaContext.xml), и это сработало. Я не понимаю, где проблема –

ответ

3

Я наконец-то нашел правильное решение для меня :

Я переехал <tx:annotation-driven transaction-manager="transactionManager" />

в мой файл сервлет-config.xml.

Ответ здесь:

@Transactional doesn't work in Spring Web MVC?

+0

Спасибо за сообщение! Это тоже была моя ошибка. Я просмотрел десятки SO-проводок и руководств по настройке, но никто не указал, что tx: annotation-driven принадлежит конфигурации сервлета. Большое спасибо! – andreas

+0

Я хотел бы добавить: если вы используете такие вещи, как запланированные задачи (например, регулярные почтовые отчеты, которые управляют базой данных), вам также потребуется в app-context.xml, так что у вас есть это в обоих файлах (app-context.xml + MyServlet-config.xml)! – andreas

+0

Странно, но это исправлено и в моей проблеме. – Raf

Смежные вопросы

 Смежные вопросы