2012-04-04 47 views
17

मुझे पहले इस मुद्दे पर एक पोस्ट था जिसे हल किया गया था। हालांकि ऑटो वायर्ड बीन्स और कम एक्सएमएल कॉन्फ़िगरेशन के साथ प्रोजेक्ट का पुनर्निर्माण करने के बाद से मुझे लगता है कि मैं इस मुद्दे पर फिर से विचार कर रहा हूं। मैंने अपनी पिछली परियोजना को लागू करने के तरीके का पालन किया है लेकिन यह काम नहीं करता है। क्या कोई मेरी मदद कर सकता है कि इसे काम करने के लिए मुझे क्यों या क्या बदलना चाहिए?वसंत @ ट्रांसेक्शन काम नहीं कर रहा

मैं जानबूझकर अपवाद फेंकने के लिए सम्मिलित उपयोगकर्ता विवरण विधि में मौजूद एक मौजूदा तालिका नाम का उपयोग कर उद्देश्य पर हूं। हालांकि उपयोगकर्ता को सम्मिलित करने और उपयोगकर्ता भूमिकाओं को सम्मिलित करने के लिए बयान वापस नहीं लुढ़काए जाते हैं। कृपया मदद करे।


पंजीकरण के लिए मेरा वर्तमान डिज़ाइन इस तरह है।

के भाग servlet.xml:

<context:component-scan base-package="com.doyleisgod.golfer.controllers"/> 
<context:component-scan base-package="com.doyleisgod.golfer.dao"/> 
<context:component-scan base-package="com.doyleisgod.golfer.services"/> 
<context:component-scan base-package="com.doyleisgod.golfer.validators"/> 


का हिस्सा आवेदन संदर्भ:

<context:annotation-config /> 
<tx:annotation-driven />  

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
<property name="driverClassName" value="${jdbc.driverClassName}"/> 
<property name="url" value="${jdbc.url}"/> 
<property name="username" value="${jdbc.username}"/> 
<property name="password" value="${jdbc.password}"/> 
</bean> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 


पंजीकरण नियंत्रक:

package com.doyleisgod.golfer.controllers; 

import javax.validation.Valid; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.validation.BindingResult; 
import org.springframework.web.bind.WebDataBinder; 
import org.springframework.web.bind.annotation.InitBinder; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import com.doyleisgod.golfer.formdata.RegistrationForm; 
import com.doyleisgod.golfer.services.IRegistrationService; 
import com.doyleisgod.golfer.validators.RegistrationFormValidator; 

/** 
* Description: Registration controller provides and processes the registration form. 
* @author Chris Doyle 
*/ 
@Controller 
@RequestMapping("/registration.htm") 
public class RegistrationController { 
    protected final Log logger = LogFactory.getLog(getClass()); 
    @Autowired private IRegistrationService iRegistrationService; 
    @Autowired private RegistrationFormValidator registrationFormValidator; 

    // sets a customer validator for the registration form 
    @InitBinder 
    protected void initBinder(WebDataBinder binder) { 
     binder.setValidator(registrationFormValidator); 
    } 

    // Description: Method called by a get request to the registration controller. Returns the 
    @RequestMapping(method=RequestMethod.GET) 
    public String registration (Model model){ 
     model.addAttribute(new RegistrationForm()); 
     return "registration"; 
    } 

    // Description: Method called by a post request to the registration controller. Method calls validation on the registration form using custom validator and returning 
    // any errors back to the user. 
    @RequestMapping(method=RequestMethod.POST) 
    public String processRegistration (@Valid RegistrationForm registrationForm, BindingResult bindingResult, Model model){ 
     logger.info("Received the following registration form details"); 
     logger.info(registrationForm.toString()); 

     if (bindingResult.hasErrors()) { 
      logger.warn("Registration Validation Failed"); 
      model.addAttribute("validationError", "Please correct the fields marked with errors"); 
      return "registration"; 
     } 

     try { 
      iRegistrationService.registerUser(registrationForm); 
     } catch (Exception e) { 
      logger.error("An Exception has occured processing the registration form"); 
      model.addAttribute("exceptionError", "An exception has occured, please try again."); 
      e.printStackTrace(); 
      return "registration"; 
     } 

     return "redirect:login.htm?registration=sucessful"; 
    } 
} 


पंजीकरण सेवा:

package com.doyleisgod.golfer.services; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.security.authentication.encoding.ShaPasswordEncoder; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 
import org.springframework.transaction.support.TransactionSynchronizationManager; 

import com.doyleisgod.golfer.dao.IRegistrationDAO; 
import com.doyleisgod.golfer.formdata.RegistrationForm; 

@Service("IRegistrationService") 
public class RegistrationService implements IRegistrationService { 
    @Autowired private IRegistrationDAO iRegistrationDAO; 
    private final boolean enabled = true; 
    private final String roles = "ROLE_USER"; 


    @Override 
    @Transactional (rollbackFor = Exception.class) 
    public void registerUser(RegistrationForm registrationForm) throws Exception { 
     System.out.println("inside the registerUser method. is wrapped in transaction: "+TransactionSynchronizationManager.isActualTransactionActive()); 

     String username = registrationForm.getUsername(); 
     String password = registrationForm.getPassword(); 
     String firstname = registrationForm.getFirstname(); 
     String lastname = registrationForm.getLastname(); 
     String email = registrationForm.getEmail(); 
     int handicap = Integer.parseInt(registrationForm.getHandicap()); 
     String encryptedPassword = ((new ShaPasswordEncoder()).encodePassword(password, username)); 

     iRegistrationDAO.insertUser(username, encryptedPassword, enabled); 
     iRegistrationDAO.insertRoles(username, roles); 
     iRegistrationDAO.insertUserDetails(username, firstname, lastname, email, handicap); 
    } 

    @Override 
    public boolean checkUser(String username) { 
     return iRegistrationDAO.checkUserName(username); 
    } 
} 


पंजीकरण डीएओ:

package com.doyleisgod.golfer.dao; 

import javax.annotation.Resource; 
import org.apache.commons.dbcp.BasicDataSource; 
import org.springframework.jdbc.core.JdbcTemplate; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.support.TransactionSynchronizationManager; 

@Repository("iRegistrationDAO") 
public class RegistrationDAO extends JdbcTemplate implements IRegistrationDAO { 

    @Resource private BasicDataSource dataSource; 

    @Override 
    public boolean checkUserName(String username) { 
     int db_user = queryForInt("select count(username) from users where username = ?", username); 

     if (db_user == 1){ 
      return true; 
     } 

     return false; 
    } 

    @Override 
    public void insertUser(String username, String password, boolean enabled) throws Exception { 
     System.out.println("inside the insertuser method. is wrapped in transaction: "+TransactionSynchronizationManager.isActualTransactionActive()); 

     update("insert into users (username, password, enabled) VALUES (?,?,?)", username, password, enabled); 
    } 

    @Override 
    public void insertRoles(String username, String roles) throws Exception { 
     update("insert into user_roles (username, authority) VALUES (?,?)", username, roles); 
    } 

    @Override 
    public void insertUserDetails(String username, String firstname, String lastname, String email, int handicap) throws Exception { 
     update("insert into user_detailss (username, first_name, last_name, email_address, handicap)" + 
       "VALUES (?,?,?,?,?)", username, firstname, lastname, email, handicap); 

    } 

    public void setDataSource(BasicDataSource dataSource) { 
     this.dataSource = dataSource; 
    } 

    public BasicDataSource getDataSource() { 
     return dataSource; 
    } 
} 
+0

मुद्दा सर्वलेट एक्सएमएल में नियंत्रकों के अलावा अन्य घटकों के लिए घटक स्कैन होने के साथ लग रहा था। मैंने '<संदर्भ: घटक-स्कैन बेस-पैकेज =" कॉम ले जाया।doyleisgod.golfer.dao "/><संदर्भ: घटक-स्कैन बेस-पैकेज =" com.doyleisgod.golfer.services "/><संदर्भ: घटक-स्कैन बेस-पैकेज =" com.doyleisgod.golfer.validators "/> 'आवेदन संदर्भ xml में जो समस्या को हल करने लग रहा था। मुझे यकीन नहीं है कि क्यों कोई ऐसा कारण प्रदान करना चाहता है कि यह काम पोस्ट करने के लिए स्वतंत्र क्यों हो गया। –

उत्तर

39

कारण यह है कि आवेदन संदर्भ एक्सएमएल को context:component-scan टैग चलती तय लेन-देन संबंधी व्यवहार है : <tx:annotation-driven /> एक पोस्ट प्रोसेसर है जो @Transactional एओपी विधि इंटरसेप्टर के साथ एनोटेटेड बीन विधियों को लपेटता है जो लेनदेन संबंधी व्यवहार को संभालता है। वसंत के बाद प्रोसेसर, केवल विशिष्ट अनुप्रयोग संदर्भ वे में परिभाषित कर रहे हैं पर कार्य करते हैं।

आपके मामले में, आप आवेदन के संदर्भ में <tx:annotation-driven /> बाद प्रोसेसर को परिभाषित किया है, जबकि सेम @Transactional साथ एनोटेट सर्वलेट आवेदन संदर्भ में कर रहे हैं । इस प्रकार, <tx:annotation-driven /> पोस्ट प्रोसेसर केवल एप्लिकेशन संदर्भ बीन्स पर संचालित होता है, सर्वलेट संदर्भ बीन्स नहीं। जब context:component-scan टैग को एप्लिकेशन संदर्भ में ले जाया गया था, तो <tx:annotation-driven /> पोस्ट प्रोसेसर ने अपने लेनदेन संबंधी तरीकों को उचित रूप से लपेट लिया था।

आशा है कि कुछ समझ में आता है।

[संपादित करें]

What is the difference between the Application Context and a Servlet Context?

What is a Spring post-processor and how does it work?

What is AOP in Spring?

+0

मैंने सोचा कि स्प्रिंग एमवीसी * को * @ नियंत्रक की आवश्यकता है DispatcherServlet संदर्भ के बजाय जड़ ContextLoaderListener संदर्भ से स्कैन किया जा करने के लिए। इसलिए, मुझे लगता है कि @ Controller' आवेदन संदर्भ के लिए 'की स्कैनिंग जाने के रूप में अच्छी तरह से हैरान हूँ, अभी भी' @ RequestMapping' काम में आता है। (वास्तव में, यह अनुमति देगा एक 'नियंत्रक' वर्गों में '@ ट्रांजेक्शनल 'का उपयोग करने के लिए; केवल साइड इफेक्ट्स के बारे में सोच रहा है।) – Arjan

+0

(ए * त्वरित * परीक्षण डिस्पैटर सर्वलेट के संदर्भ से' नियंत्रक 'की स्कैनिंग को हटाने और एप्लिकेशन संदर्भ से स्कैनिंग, वास्तव में मेरे सभी @ @ RequestMapping को अनदेखा किया जाता है, और इसलिए टिप्पणी है कि वह एप्लिकेशन संदर्भ में जो अपने लेन-देन समस्या का समाधान हो में दाव और सेवाओं घटक स्कैन ले जाया गया में असफल।) – Arjan

+2

ओपी राज्यों। टिप्पणी में सवाल क्यों था, जिसका मैंने जवाब दिया। ओपी सर्वलेट संदर्भ से बाहर MVC नियंत्रकों के लिए घटक स्कैन स्थानांतरित नहीं किया। इस प्रकार, मुझे यकीन नहीं है कि @ अरजन से ये टिप्पणियां क्या हैं। – MarkOfHall

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

  • कोई संबंधित समस्या नहीं^_^