2011-09-26 25 views
13

Tôi đang sử dụng Spring 3 với Hibernate 3. Tôi đang cố định cấu hình giao dịch khai báo mùa xuân, nhưng không có vấn đề gì tôi cố gắng, giao dịch mùa xuân không bắt đầu.Spring @Transaction không bắt đầu giao dịch

Dưới đây là cấu hình của tôi

File: applicationContext-hibernate.xml

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

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

<bean id="mdbDataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
... 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
<property name="dataSource" ref="mdbDataSource" /> 
    <property name="annotatedClasses"> 
..... 
</bean> 

Tôi có một ServiceLocatorImpl lớp mà thực hiện giao diện ServiceLocator

@Service("serviceLocator") 
@Transactional 
public class ServiceLocatorImpl implements ApplicationContextAware, Serializable, ServletContextAware, ServiceLocator { 
public ResultObject executeService(Map objArgs) 
{ 
     if(TransactionSynchronizationManager.isActualTransactionActive()) { 
      LOGGER.debug("ServiceLocator:executeService - Active transaction found"); 
     } else { 
     LOGGER.error("No active transaction found"); 
     } 
     ...... 
} 
    .... 
} 

Dường như với tôi rằng tất cả các cấu hình của tôi đúng. Nhưng khi phương thức executeService được gọi, TransactionSynchronizationManager.isActualTransactionActive() luôn trả về false.

Hãy giúp tôi giải quyết vấn đề này. Hãy cho tôi biết nếu cần thêm thông tin.

Cập nhật: tôi đã có dây các ServiceLocator thành một trong những lớp khác, như sau:

@Autowired 
private ServiceLocator serviceLocator; // ServiceLocator is interface 

Tôi đang sử dụng Spring phiên bản 3.0.0.

executeService() là một phương thức được xác định trong giao diện ServiceLocator. Tôi đã cập nhật mã để ném ngoại lệ thay vì chỉ đăng nhập lỗi. Sau đây là dấu vết ngăn xếp, tôi không thấy bất kỳ tạo proxy nào trong dấu vết này. Hãy giúp tôi.

java.lang.RuntimeException: No active transaction found 
at com.nihilent.venice.common.service.ServiceLocatorImpl.logTransactionStatus(ServiceLocatorImpl.java:102) 
at com.nihilent.venice.common.service.ServiceLocatorImpl.executeService(ServiceLocatorImpl.java:47) 
at com.nihilent.venice.web.controller.CommonController.handleRequest(CommonController.java:184) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710) 
at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414) 
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402) 
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771) 
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) 
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647) 
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646) 
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436) 
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374) 
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302) 
at org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:709) 
at org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:680) 
at org.apache.jsp.index_jsp._jspService(index_jsp.java:57) 
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:386) 
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) 
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176) 
at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145) 
at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92) 
at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:381) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at com.nihilent.venice.web.filter.DyanamicResponseHeaderFilter.doFilter(DyanamicResponseHeaderFilter.java:33) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118) 
at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:343) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:188) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:355) 
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:149) 
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at com.nihilent.venice.web.filter.RequestFilter.doFilter(RequestFilter.java:44) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859) 
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
at java.lang.Thread.run(Thread.java:619) 

Update [Solved] tôi bị vấn đề cố định. Trước khi đưa ra câu trả lời như cách nó đã được cố định, tôi cần cung cấp thêm một số thông tin. Tôi đang sử dụng Spring MVC trong dự án của mình. Kiểm soát DispatchServlet được cấu hình trong web.xml. Bộ điều khiển phía trước này có tệp cấu hình xml abc-servlet.xml (abc là tên servlet trong tệp web.xml). Tôi cũng có các tệp cấu hình mùa xuân khác được định nghĩa là context-param trong web.xml. Một trong các tệp là applicationContext-hibernate.xml tệp.

Tôi đã xác định txManager<tx:annotation-driven />, trong tệp applicationContext-hibernate.xml. Hôm nay tôi đã tự hỏi liệu @Autowired và làm việc @Transactional với nhau, vì vậy tôi Google thông tin, và tìm thấy chủ đề này

http://forum.springsource.org/showthread.php?48815-Repository-Autowired-Transaction-not-returning-proxy-and-causes-exception

Các chủ đề thảo luận về vấn đề tương tự, và điều này giải quyết vấn đề.

I implemented one of the suggestion and added <tx:annotation-driven .../> to my servlet's application context xml and it fixes the problem.

tư duy mà tôi cũng chuyển <tx:annotation-driven /> của tôi vào tập tin abc-servlet.xml và nó làm việc.

bản ghi của tôi bây giờ đang shoulding các thông điệp yêu cầu:

[venice] DEBUG [http-8080-1] 27 Sep 2011 14:24:06,312 ServiceLocatorImpl.logTransactionStatus(100) | ServiceLocator:executeService - Active transaction found

Nhờ mọi người giúp đỡ. Có thể thông tin này sẽ hữu ích cho ai đó. Tôi vẫn muốn nghe về giải thích tại sao nó không hoạt động trước đó.

+0

là 'executeService() 'thực hiện một phương pháp được xác định trong' ServiceLocator'? Bạn có thể ném ngoại lệ từ phương pháp này thay vì ghi nhật ký lỗi và dán dấu vết ngăn xếp không? Tôi muốn xem liệu khía cạnh giao dịch có nằm trong ngăn xếp hay không. Ngoài ra, vui lòng cung cấp phiên bản Spring chính xác. –

+0

Bạn có thể chỉ ra cách gọi phương thức này không? Ngoài ra, bạn có thể kiểm tra loại dụ của ServiceLocator, đó có phải là một cá thể proxy không? –

+0

Tôi đã cập nhật câu hỏi với theo dõi ngăn xếp bắt buộc. Khi cập nhật, tôi đang tiêm cá thể 'ServiceLocator' trong bean gọi. 'executeService()' được định nghĩa trong giao diện 'ServiceLocator'. –

Trả lời

4

tôi đoán sẽ được rằng bạn đang cố gắng làm một cái gì đó như:

ServiceLocator locator = new ServiceLocatorImpl(); 
... 
locator.executeService(someMap); 

và sau đó là ngạc nhiên rằng không có giao dịch. Quản lý giao dịch và tất cả các dịch vụ Spring khác chỉ áp dụng cho các bean trong ngữ cảnh ứng dụng *. Bạn cần lấy ví dụ của bạn từ ngữ cảnh này theo cách này hay cách khác thay vì chỉ tạo ra một thể hiện. Nếu không, hạt định vị của bạn nằm trong ngữ cảnh ứng dụng riêng biệt hơn là nơi bạn khai báo tx:annotation-driven.

* Trừ khi bạn đang sử dụng AspectJ build- or load-time bytecode weaving với Spring.

Chỉnh sửa: Vấn đề chính xác là những gì tôi đã nói (phần thứ hai). Bạn tạo hai bối cảnh ứng dụng. Bạn đã tạo ServiceLocator của mình trong phiên bản đầu tiên, nhưng bạn chỉ kích hoạt các giao dịch hướng chú thích trong giao dịch thứ hai. Dường như bạn không hiểu ranh giới giữa các ngữ cảnh. Nói chung - ít nhất là trong kinh nghiệm của tôi - các bean "kinh doanh", giống như ServiceLocator của bạn, sống trong ngữ cảnh gốc, là cái bắt đầu bằng ContextLoaderListener và được định cấu hình qua contextConfigLocation. Bộ điều khiển và các bean khác cấu hình hoặc được sử dụng bởi DispatcherServlet trực tiếp trong một ngữ cảnh khác liên kết với servlet đó được cấu hình bởi tệp *-servlet.xml. Bối cảnh này trở thành một bối cảnh con của bối cảnh gốc, và các bean trong nó có thể được tiêm với các bean từ ngữ cảnh gốc, mặc dù không ngược lại.

Từ quan điểm của tôi, bạn đã làm mọi thứ tồi tệ hơn trước đây bằng cách thêm tx:annotation-driven vào ngữ cảnh con được liên kết với DispatcherServlet của bạn. Thay vào đó, bạn nên đảm bảo rằng ServiceLocator được tạo trong ngữ cảnh gốc, nơi các dịch vụ giao dịch đã có sẵn và là nơi chúng thuộc về.

+0

Tôi không instantiating ServiceLocator, thay vào đó tôi đang tiêm bean dịch vụ định vị. Thông tin cuộc gọi được cập nhật trong bài đăng gốc. –

+0

@ user746528: Đã cập nhật câu trả lời của tôi –

1

Bạn chỉ cần đổi tên "txManager" thành "transactionManager". Từ EnableTransactionManagement 's JavaDoc:

… trong trường hợp XML, tên là "transactionManager". Các <tx:annotation-driven/> được cứng có dây để tìm kiếm một bean có tên là "transactionManager" theo mặc định ...

Các vấn đề liên quan