2012-05-10 14 views
6

मेरी @ ट्रान्सैक्शनल एनोटेशन को अनदेखा किया जा रहा है। मुझे स्प्रिंग कंटेनर के प्रारंभ में कोई त्रुटि नहीं है। ऐसा लगता है कि स्प्रिंग TX ढांचे द्वारा मेरी विधि को प्रॉक्सी नहीं किया गया है। मेरी सेवा की विधि के निष्पादन के दौरान, जेडीबीसीटीप्लेट द्वारा अपेक्षित रनटाइम अपवाद फेंक दिया गया है। समस्या यह है कि जेडीबीसी कनेक्शन रोलबैक नहीं किया गया है और बदलाव जारी रहे हैं। स्टैकट्रैक प्रॉक्सी का कोई संकेत नहीं दिखाता है जो मेरी सेवा की विधि को लपेटना चाहता है।वसंत @ ट्रान्सएक्शनल एनोटेशन अनदेखा

संपादित करें: जोड़ा नियंत्रक कोड

संपादित करें 2: जोड़ा सेवा के इंटरफ़ेस

यहाँ मेरी सेवा इंटरफ़ेस है।

public interface ApplicationsService { 
    public Application getApplicationById(int id); 

    public void createApplication(Application application); 

    public void createInstance(Application application); 

    public Map<Integer, Application> getUserApplications(String username); 

    public Application newApplication(String email); 
} 

यहां मेरी सेवा है।

@Service 
public class ApplicationsServiceImpl implements ApplicationsService { 
    ... 
    @Transactional 
    public void createApplication(Application application){ 
     // Persisting the application. 
     applicationDAO.createApplication(application); 
     application.setId(
      applicationDAO.findApplicationId(application.getName(), application.getAccount().getEmail()) 
     ); 

     // Creating the physical instance. 
     createInstance(application); 
    } 
    ... 
} 

विधि कॉल के लिए जिम्मेदार वसंत नियंत्रक।

@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"; 
    } 
    ... 
} 

यहाँ मेरी स्प्रिंग लेन-देन विन्यास

<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> 

है createApplication के निष्पादन के दौरान, एक RuntimeException JDBCTemplate द्वारा शुरू की है और लेन-देन rollbacked नहीं है। ,

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

वैकल्पिक रूप से, प्रति केविन Welker की टिप्पणी नहीं तो कार्य करें:

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

और ठोस वर्ग:

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

क्या आपकी 'createAplication() 'विधि को उसी वर्ग में एक अलग विधि द्वारा बुलाया जा रहा है? या इसे बाहर से बाहर रखा जा रहा है, किसी अन्य वर्ग द्वारा जिसे 'एप्लिकेशन सेवा' इंजेक्शन दिया जाता है? –

+0

कोई बात नहीं, मैंने अभी आपके स्टैक ट्रेस में देखा है कि इसे बाहरी रूप से बुलाया जा रहा है। –

+0

क्या आपकी इकाई ऑब्जेक्ट 'एप्लिकेशन' में' स्थिति 'नामक फ़ील्ड है। डेटाबेस स्तर में इसके लिए बाधाओं की जांच करें। क्या इसे किसी भी डिफ़ॉल्ट मान की आवश्यकता है? आप किस डेटाबेस का उपयोग कर रहे हैं? यदि आप अपना एंट्री कोड भी पोस्ट करते हैं तो यह अच्छा होगा। – raddykrish

उत्तर

9

मेरा अनुमान है कि आपने अपनी सेवा बीन्स को उस संदर्भ में रखा है जो प्रेषक सर्वलेट से संबंधित है, जहां केवल नियंत्रक सेम जीने वाले हैं, और फिर आपने रूट लेनदेन में अपने लेनदेन सेम घोषित कर दिए हैं। एनोटेशन-आधारित लेनदेन ऑटो-प्रॉक्सीइंग केवल एक संदर्भ में लागू होता है, इसलिए आपकी सेवा बीन्स दूसरे (गलत) संदर्भ में प्रभावित नहीं होंगे। समस्या के पूर्ण विवरण के लिए my answer to "Why DispatcherServlet creates another application context?" देखें। मूल समस्या यह है कि आप समझ नहीं पाते हैं कि वसंत एमवीसी अनुप्रयोग में संदर्भ कैसे व्यवस्थित किए जाते हैं।

+4

शायद आप अच्छे पाठ को इंगित कर सकते हैं जो बताता है कि संदर्भ कैसे व्यवस्थित किए जाते हैं? धन्यवाद :) –

5

आप @Transactional एनोटेशन काम के लिए के लिए एक इंटरफेस परिभाषित करने की जरूरत एक इंटरफ़ेस चाहते हैं (हालांकि आपको शायद एक इंटरफ़ेस लिखना चाहिए), आप proxy-target-class:

का उपयोग कॉन्फ़िगर कर सकते हैं
<tx:annotation-driven proxy-target-class="true" /> 

संपादित

संदेश आपके SQLException से है:

Field 'status' doesn't have a default value 

तो हो सकता है आप null में गुजर रहे हैं जहां एक मूल्य प्रदान किया जाना चाहिए? वैकल्पिक रूप से, इस त्रुटि से जुड़े कुछ अजीबता के लिए this post देखें।

+4

यदि आप क्लास प्रॉक्सीइंग के लिए कॉन्फ़िगर करते हैं, तो यह एक इंटरफ़ेस नहीं होना चाहिए। [अधिक के लिए यह उत्तर] देखें (http://stackoverflow.com/a/4143586/433348) –

+0

मैंने एक इंटरफ़ेस का उपयोग करने की कोशिश की और अभी भी वही परिणाम हैं। मैं किए गए परिवर्तनों को अपडेट करूंगा। –

+0

यदि रीस्टलेट के साथ मिलकर, आपको इंटरफ़ेस की आवश्यकता नहीं है और कुछ भी कॉन्फ़िगर करने की आवश्यकता नहीं है, लेकिन केवल उन तरीकों को जिन्हें रीसेट लाभ लेनदेन से बुलाया जाता है। – h22

2

डिबगिंग के तीन दिनों के बाद, मुझे अंत में कारण मिला कि मेरी टिप्पणियां क्यों नजरअंदाज कर दी गईं।

<tx:annotation-driven/> एक बाल संदर्भ फ़ाइल में स्थित निर्देश के पास अपने मूल वसंत संदर्भ द्वारा बनाए गए सेम तक पहुंच नहीं है।

मुझे इसे अपने अनुरोध प्रेषक द्वारा उपयोग किए गए myapp-servlet.xml पर ले जाना पड़ा।

अब, यह ठीक से काम कर रहा है।

+0

यह सही समाधान नहीं है। यह सबसे अच्छा कामकाज है, और आपने गलत समझा है कि कौन सा संदर्भ माता-पिता है और वह बच्चा कौन सा है। सही स्पष्टीकरण/समाधान के लिए [मेरा जवाब] (http://stackoverflow.com/a/10564908/839646) देखें। –

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