2011-09-26 11 views
13

मैं स्प्रिंग 3 का उपयोग हाइबरनेट 3 के साथ कर रहा हूं। मैं वसंत घोषणात्मक लेनदेन को कॉन्फ़िगर करने की कोशिश कर रहा हूं, लेकिन इससे कोई फर्क नहीं पड़ता कि मैं क्या प्रयास करता हूं, वसंत लेनदेन शुरू नहीं हो रहा है।वसंत @ ट्रांज़ेक्शन लेनदेन शुरू नहीं कर रहा है

यहाँ मेरी विन्यास

फ़ाइल है: 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> 

मैं एक वर्ग ServiceLocatorImpl जो 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"); 
     } 
     ...... 
} 
    .... 
} 

मुझे ऐसा लगता है कि मेरे सभी विन्यास सही है। लेकिन जब executeService विधि कहा जाता है, TransactionSynchronizationManager.isActualTransactionActive() हमेशा झूठी लौट रहा है।

कृपया इस समस्या को हल करने में मेरी मदद करें। अगर कोई और जानकारी आवश्यक है तो मुझे बताएं।

अद्यतन: मैं, अन्य वर्गों में से एक में ServiceLocator वायर्ड है इस प्रकार है:

@Autowired 
private ServiceLocator serviceLocator; // ServiceLocator is interface 

मैं वसंत का उपयोग कर रहा 3.0.0 संस्करण।

executeService() सेवा लोकेटर इंटरफ़ेस में परिभाषित विधि है। मैंने सिर्फ एक त्रुटि लॉगिंग के बजाय अपवाद फेंकने के लिए कोड अपडेट किया। स्टैक ट्रेस निम्नलिखित है, मुझे इस ट्रेस में कोई प्रॉक्सी सृजन नहीं दिख रहा है। कृपया मदद करे।

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) 

अद्यतन [हल] मैं समस्या का समाधान हो गया। उत्तर देने से पहले कि यह कैसे तय किया गया था, मुझे कुछ और जानकारी प्रदान करने की आवश्यकता है। मैं अपनी परियोजना में स्प्रिंग एमवीसी का उपयोग कर रहा हूं। नियंत्रण DispatchServlet web.xml में कॉन्फ़िगर किया गया है। इस फ्रंट कंट्रोलर में एक कॉन्फ़िगरेशन xml फ़ाइल abc-servlet.xml है (abc web.xml में सर्वलेट नाम है)। मेरे पास अन्य वसंत कॉन्फ़िगरेशन फ़ाइलें भी हैं जिन्हें web.xml में परिभाषित किया गया है। फ़ाइल में से एक applicationContext-hibernate.xml फ़ाइल है।

मैंने applicationContext-hibernate.xml फ़ाइल में txManager और <tx:annotation-driven /> परिभाषित किया। आज मैं सोच रहा था कि क्या @Autowired और @Transactional काम एक साथ के साथ, तो मैं जानकारी Google, और पाया इस सूत्र

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

समान समस्या के बारे में बात करते हैं धागा, और इस समस्या का हल।

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

यह सोच कर कि मैं भी एबीसी-servlet.xml फ़ाइल में मेरी <tx:annotation-driven /> चले गए और यह काम किया। की मदद के लिए हर किसी के लिए

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

धन्यवाद:

मेरे लॉग अब आवश्यक संदेशों shoulding कर रहे हैं। यह जानकारी किसी के लिए उपयोगी होगी। मैं अभी भी स्पष्टीकरण के बारे में सुनना चाहूंगा क्योंकि यह पहले क्यों काम नहीं कर रहा था।

+0

'execLocator' में परिभाषित विधि को निष्पादित करने के लिए' executeService() 'है? क्या आप किसी त्रुटि को लॉग करने और स्टैक ट्रेस पेस्ट करने के बजाय इस विधि से अपवाद फेंक सकते हैं? मैं देखना चाहता हूं कि लेनदेन पहलू ढेर पर है या नहीं। कृपया सही वसंत संस्करण प्रदान करें। –

+0

क्या आप दिखा सकते हैं कि विधि को कैसे कहा जाता है? क्या आप यह भी जांच सकते हैं कि इंस्टेंस प्रकार का सर्विस लोकेटर क्या है, क्या यह प्रॉक्सी उदाहरण है? –

+0

मैंने आवश्यक स्टैक ट्रैक के साथ प्रश्न अपडेट किया है। अपडेट के रूप में मैं कॉलिंग बीन में 'ServiceLocator' उदाहरण इंजेक्शन दे रहा हूं। 'executeService()' 'ServiceLocator' इंटरफ़ेस में परिभाषित किया गया है। –

उत्तर

4

मेरा अनुमान होगा कि आप की तरह कुछ करने के लिए कोशिश कर रहे हैं: हैरान कोई लेन-देन नहीं है कि किया जा रहा है

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

और उसके बाद। लेनदेन प्रबंधन और अन्य सभी स्प्रिंग सेवाएं केवल आवेदन संदर्भ * में बीन्स पर लागू होती हैं। आपको तुरंत इंस्टेंट करने के बजाय संदर्भ से अपना उदाहरण एक या दूसरे तरीके से प्राप्त करने की आवश्यकता है। अन्यथा आपका लोकेटर बीन एक अलग एप्लिकेशन संदर्भ में है जहां आप tx:annotation-driven घोषित करते हैं।

* जब तक आप वसंत के साथ AspectJ build- or load-time bytecode weaving का उपयोग नहीं कर रहे हैं।

संपादित करें: समस्या वास्तव में मैंने जो कहा (दूसरा भाग)। आप दो आवेदन संदर्भ बनाते हैं। आप पहले में अपना सर्विस लॉकर बना रहे थे, लेकिन आपने केवल दूसरे में एनोटेशन-संचालित लेन-देन को सक्षम किया था। आप संदर्भों के बीच की सीमाओं को समझ नहीं सकते हैं। आम तौर पर - कम से कम मेरे अनुभव में - "व्यवसाय" सेम, आपके सर्विस लोकेटर की तरह, रूट संदर्भ में रहते हैं, जिसे ContextLoaderListener द्वारा शुरू किया गया है और contextConfigLocation के माध्यम से कॉन्फ़िगर किया गया है। नियंत्रक और अन्य बीन्स जो डिस्पैचर सर्वलेट द्वारा कॉन्फ़िगर या उपयोग किए जाते हैं, उस सर्वलेट से जुड़े किसी अन्य संदर्भ में रहते हैं जो *-servlet.xml फ़ाइल द्वारा कॉन्फ़िगर किया गया है। यह संदर्भ मूल संदर्भ का एक बाल संदर्भ बन जाता है, और इसमें सेम को मूल संदर्भ से सेम के साथ इंजेक्शन दिया जा सकता है, हालांकि इसके विपरीत नहीं।

मेरे परिप्रेक्ष्य से, आपने tx:annotation-driven को अपने डिस्पैचर सर्विलेट से जुड़े बाल संदर्भ में जोड़कर इससे पहले की तुलना में बदतर चीजों को तोड़ दिया है। इसके बजाए, आपको यह सुनिश्चित करना चाहिए कि सेवा लोकेटर रूट संदर्भ में बनाया गया है, जहां लेनदेन संबंधी सेवाएं पहले से ही उपलब्ध हैं और वे कहां हैं।

+0

मैं सेवा लोकेटर को तुरंत चालू नहीं कर रहा हूं, इसके बजाय मैं सेवा लोकेटर बीन इंजेक्शन दे रहा हूं। कॉलिंग जानकारी मूल पोस्ट में अपडेट की गई है। –

+0

@ user746528: मेरा उत्तर अपडेट किया गया –

1

आपको बस अपने "txManager" को "लेन-देन प्रबंधक" का नाम बदलना चाहिए। से EnableTransactionManagement के JavaDoc:

... एक्सएमएल मामले में, नाम "transactionManager" है। <tx:annotation-driven/> डिफ़ॉल्ट रूप से "लेनदेन प्रबंधक" नामक एक बीन की तलाश करने के लिए कठिन है ...

संबंधित मुद्दे