2012-05-10 23 views
6

@Transactionnal ek açıklamalar yok sayılıyor. Bahar konteynerinin başlatılmasında hatam yok. Benim yöntemim Spring TX framework tarafından proxy edilmemiş gibi görünüyor. Hizmet yöntemimin yürütülmesi sırasında, beklenen bir RuntimeException JDBCTemplate tarafından atılır. Sorun, JDBC bağlantısının geri alınmaması ve değişikliklerin devam ettirilmesidir. Stacktrace, hizmetimin yöntemini sarması gereken vekilin herhangi bir işaretini göstermez.Spring @Transaction ek açıklamaları yok sayıldı

Düzenleme: Eklenen Denetçi'nin kod

Düzenleme 2: Added Servis'in Arayüz

İşte benim Servis Arabirimi olduğunu.

İşte benim Hizmetim. Metot çağrısı, sorumlu çağrıdan sorumludur.

Spring Controller, yöntem çağrısından sorumludur.

@Controller 
@RequestMapping("/applications") 
public class ApplicationsController { 
    ... 
    @Autowired 
    private ApplicationsService applicationsService; 
    ... 

    @RequestMapping(method=RequestMethod.POST) 
    public String saveApplication(
     @Valid Application application, 
     BindingResult bindingResult, 
     Principal principal 
    ){ 
     application.setAccount(this.accountService.getAccount(principal.getName())); 
     this.applicationsService.createApplication(application); 

     return "application/creatingApplication"; 
    } 
    ... 
} 

İşte createApplication yürütülmesi sırasında benim Bahar işlem yapılandırma

<beans 
    xmlns="http://www.springframework.org/schema/beans" 
    xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 

          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx-3.1.xsd" 
> 
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="DADataSource"/> 
    </bean> 

    <tx:annotation-driven /> 
</beans> 

olduğunu bir RuntimeException JDBCTemplate tarafından başlatılır ve işlem rollbacked edilmez.

public interface ApplicationsService { 
    public void createApplication(Application application); 
} 

Ve beton sınıfı:

@Service 
public class ApplicationsServiceImpl { 
    @Transactional 
    public void createApplication(Application application) { 
     // ... 
    } 
} 

Alternatif Kevin Welker yorumun başına yapmazsanız @Transactional ek açıklamalar çalışması için

GRAVE: Servlet.service() for servlet [DACloudWeb] in context with path [/DACloudWeb] threw exception [Request processing failed; 
nested exception is org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [INSERT INTO instances ( serverId, appId, lastDeployment) VALUES ( ?,?,?) ]; SQL state [HY000]; error code [1364]; Field 'status' doesn't have a default value; nested exception is java.sql.SQLException: Field 'status' doesn't have a default value] with root cause 
    java.sql.SQLException: Field 'status' doesn't have a default value 
     at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) 
     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) 
     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) 
     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) 
     at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2345) 
     at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2330) 
     at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
     at org.apache.tomcat.dbcp.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105) 
     at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:818) 
     at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:1) 
     at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587) 
     at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:812) 
     at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:868) 
     at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:876) 
     at com.cspinformatique.dacloudWeb.applications.dao.InstanceJDBCDAO.createInstance(InstanceJDBCDAO.java:50) 
     at com.cspinformatique.dacloudWeb.applications.service.InstanceService.createInstance(InstanceService.java:42) 
     at com.cspinformatique.dacloudWeb.applications.service.ApplicationsService.createInstance(ApplicationsService.java:63) 
     at com.cspinformatique.dacloudWeb.applications.service.ApplicationsService.createApplication(ApplicationsService.java:52) 
     at com.cspinformatique.dacloudWeb.applications.controller.ApplicationsController.saveApplication(ApplicationsController.java:64) 
     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.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213) 
     at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
     at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
     at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
     at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311) 
     at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116) 
     at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
     at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
     at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173) 
     at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
     at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
     at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
     at java.lang.Thread.run(Thread.java:680) 
+1

"createApplication()" yönteminiz aynı sınıfta farklı bir yöntemle çağrılıyor mu? Yoksa dışarıdan, ApplicationService'in enjekte edildiği başka bir sınıf tarafından mı çalıştırılıyor? –

+0

Unutmayın, yığın izinizde dışarıdan çağırıldığını gördüm. –

+0

Varlık nesnesine 'Uygula' nesnesinin 'status' adlı bir alanı var mı? Lütfen veritabanı seviyesindeki kısıtlamaları kontrol edin. Herhangi bir varsayılan değer gerektiriyor mu? Hangi veritabanını kullanıyorsunuz? Varlık kodunuzu da gönderirseniz iyi olur. – raddykrish

cevap

9

Tahminimce, hizmet fasulyelerinizi yalnızca denetleyici çekirdeklerinin yaşaması gereken dağıtım sunucusu sunucularına ait bağlamda yerleştirdiyseniz ve işlem çekirdeğinizi kök bağlamında bildirdiyseniz. Ek açıklama tabanlı işlem otomatik proxy, yalnızca tek bir bağlamda geçerlidir, bu nedenle diğer (yanlış) bağlamdaki hizmet çekirdekleriniz etkilenmez. Sorunun daha kapsamlı bir açıklaması için bkz. my answer to "Why DispatcherServlet creates another application context?". Temel sorun, bir Spring MVC uygulamasında bağlamların nasıl organize edildiğini anlamamanızdır.

+4

Belki de bağlamların nasıl organize edildiğini açıklayan iyi bir metne işaret edebilirsiniz. Teşekkür ederim :) –

5

Sen bir arabirim tanımlamak gerekir Bir arabirim (büyük olasılıkla bir arabirim yazmanız gerekir) istiyorsanız, proxy-target-class:

<tx:annotation-driven proxy-target-class="true" /> 

düzenlemek sizin SQLException den

mesajdır: Bir değer sağlayan olması gereken yerde Böylece belki null yılında geçiyoruz

Field 'status' doesn't have a default value 

? Alternatif olarak, bu hatayla ilişkili bazı gariplik için this post'u işaretleyin.

+4

Sınıf proxy'si için yapılandırırsanız, bir arabirim olmak zorunda değildir. Daha fazla bilgi için [bu cevaba bakın] (http://stackoverflow.com/a/4143586/433348) –

+0

Bir arabirim kullanmayı denedim ve yine de aynı sonuçları aldım. Yaptığım değişiklikleri güncelleyeceğim. –

+0

Kısıtlamalar ile birlikte, arayüze ihtiyacınız yoktur ve hiçbir şeyi yapılandırmaya gerek yoktur, ancak sadece kısıtlama kazancı işlemlerinden denen yöntemler. – h22

2

Üç günlük hata ayıklama işleminden sonra, ek notlarımın neden göz ardı edilmesinin nedenini buldum.

Bir alt bağlam dosyasında bulunan <tx:annotation-driven/> yönergesi, üst Yay ilkesi tarafından oluşturulan çekirdeklere erişemez.

İstek dağıtıcım tarafından kullanılan myapp-servlet.xml ürününe taşımak zorunda kaldım.

Şimdi, düzgün çalışıyor.

+0

Bu doğru çözüm değil. Bu en iyi ihtimalle bir çözümdür ve hangi bağlamın ebeveyn ve hangi çocuk olduğu yanlış anlaşılmıştır. Doğru açıklama/çözüm için [yanıtım] (http://stackoverflow.com/a/10564908/839646) adresine bakın. –

İlgili konular