Spring @Transaktion nicht starten Transaktionen
Bin ich mit Spring 3 mit Hibernate 3. Ich bin versucht zu konfigurieren, Spring deklaratives Transaktions -, aber egal was ich versuche, Frühling Transaktion ist nicht immer gestartet.
Hier ist meine Konfiguration
Datei: 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>
Habe ich eine Klasse ServiceLocatorImpl die ServiceLocator implementiert interface
@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");
}
......
}
....
}
Scheint es mir, dass all meine Konfiguration korrekt ist. Aber wenn executeService-Methode aufgerufen wird, TransactionSynchronizationManager.isActualTransactionActive() ist immer false zurückgeben.
Mir bitte helfen, dieses problem zu lösen. Lassen Sie mich wissen, wenn noch mehr Informationen benötigt.
Update:
Ich habe WLAN den ServiceLocator in einer der anderen Klassen, wie folgt:
@Autowired
private ServiceLocator serviceLocator; //ServiceLocator is interface
Bin ich mit Spring 3.0.0 version.
executeService() ist eine Methode definiert, in der ServiceLocator-Schnittstelle. Ich aktualisierte den code zu werfen, Ausnahme statt nur Anmeldung ein Fehler. Im folgenden ist der stack-trace, sehe ich keinen proxy-Erstellung in dieser Spur. Bitte helfen Sie.
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 [Gelöst]
Ich habe das Problem behoben. Bevor er die Antwort, wie wurde es behoben, ich muss noch einige weitere Informationen. Ich bin mit Spring MVC in meinem Projekt. Die Kontrolle DispatchServlet konfiguriert ist, in der web.xml. Dieser front-controller hat eine Konfigurations-xml-Datei abc-servlet.xml (abc als servlet name in web.xml). Ich spring Konfigurations-Dateien zu, die definiert sind als context-param
im web.xml
. Eine der Datei ist applicationContext-hibernate.xml
Datei.
Definierte ich die txManager
und <tx:annotation-driven />
im applicationContext-hibernate.xml
- Datei. Heute wurde ich gefragt, ob @Autowired und @Transactional arbeiten zusammen, also ich Google die Informationen, und diesen thread gefunden
Dem thread reden über ähnliches problem, und das löst das problem.
I implemented one of the suggestion and added <tx:annotation-driven .../> to my servlet's application context xml and it fixes the problem.
Denken, dass auch ich zog mein <tx:annotation-driven />
in abc-servlet.xml Datei und es hat funktioniert.
Meine logs sind jetzt shoulding die gewünschten Nachrichten:
[venice] DEBUG [http-8080-1] 27 Sep 2011 14:24:06,312 ServiceLocatorImpl.logTransactionStatus(100) | ServiceLocator:executeService - Active transaction found
Danke an alle für die Hilfe. Möglicherweise werden diese Informationen hilfreich sein, um jemanden. Ich würde immer noch gerne hören, über die Erklärung warum es nicht funktioniert hat früher.
- Ist
executeService()
Implementierung einer Methode definiertServiceLocator
? Können Sie werfen eine Ausnahme von dieser Methode anstelle der Protokollierung der Fehler und fügen Sie den stack-trace? Ich will sehen, ob die Transaktion-Aspekt ist auf den stack. Bitte auch den genauen Spring version. - Können Sie zeigen, wie die Methode aufgerufen wird? Auch können Sie überprüfen, was die Instanz ist, die Art der ServiceLocator, ist es eine proxy-Instanz?
- Ich habe aktualisiert die Frage mit den erforderlichen stack track. Wie aktualisiert ich bin die Injektion der
ServiceLocator
Instanz der aufrufenden bean.executeService()
definiert ist, inServiceLocator
- Schnittstelle. - Sie können und sollten, posten Sie Ihre Lösung als Antwort auf diese Frage(die Sie später annehmen).
- Was war der Vorschlag? Sie hatte bereits annotation-driven-Transaktionen. Wie wirkt sich eine Bewegung, die helfen?
- Vielen Dank für dieses.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Vermutung wäre, dass du versuchst, etwas zu tun:
und dann überrascht war, dass es keine Transaktion. Transaktions-management und alle anderen Frühlings-services gelten nur für beans im Anwendungskontext*. Sie müssen Ihre Instanz aus dem Kontext der einen oder anderen Weise, anstatt nur das instanzieren einer. Sonst wird dein locator bean ist in einem separaten Anwendungs-Kontext als dem, in dem Sie erklären
tx:annotation-driven
.*Es sei denn, du bist mit AspectJ bauen - oder load-time bytecode-weaving mit Feder.
Edit: Das problem war genau das, was ich gesagt habe (der zweite Teil). Erstellen Sie zwei anwendungskontexte. Sie schufen Ihre ServiceLocator in der ersten, aber Sie werden nur aktiviert annotation-driven-Transaktionen in der zweiten. Sie scheinen nicht zu verstehen, die Grenzen zwischen den Kontexten. In der Regel-zumindest in meiner Erfahrung-die "business" - Bohnen, wie Sie Ihre ServiceLocator, Leben in den root-Kontext, das ist die, die angefangen von der
ContextLoaderListener
konfiguriert und übercontextConfigLocation
. Controller und andere Bohnen, die konfiguriert oder verwendet werden, durch die ein DispatcherServlet Leben in einem anderen Kontext in Zusammenhang mit diesem servlet, die konfiguriert ist, die durch die*-servlet.xml
- Datei. In diesem Kontext wird ein Kind Kontext des root-Kontext, und die Bohnen in die es injiziert werden kann, mit Bohnen aus dem root-Kontext, wenn auch nicht Umgekehrt.Aus meiner Sicht, hast du gebrochen, die Dinge schlimmer als Sie waren, bevor durch Zugabe von
tx:annotation-driven
um das Kind-Kontext verbunden, um Ihre DispatcherServlet. Stattdessen sollten Sie sicherstellen, dass der ServiceLocator ist erstellt im root-Kontext, in dem die Transaktions-services sind bereits verfügbar sind und wo Sie hingehören.Sollten Sie Sie einfach benennen Sie Ihre "txManager" zu "transactionManager". Aus der
EnableTransactionManagement
's JavaDoc: