2012-10-19 16 views
5

मैं स्प्रिंग 3.1 का उपयोग कर रहा हूं और मेरी डीएओ और सेवा परत (लेनदेन) लिखा है।स्प्रिंग 3 एमवीसी नियंत्रक विधि बनाना लेनदेन

हालांकि आलसी इनिट अपवाद से बचने के लिए एक विशेष मामले में मुझे एक वसंत एमवीसी अनुरोध हैंडलर विधि @transactional बनाना है। लेकिन यह उस विधि को लेनदेन संलग्न करने में विफल रहा है। विधि का नाम मॉडल और दृश्य घर है (HttpServletRequest अनुरोध, HttpServletResponse प्रतिक्रिया)। http://forum.springsource.org/showthread.php?46814-Transaction-in-MVC-Controller इस लिंक से ऐसा लगता है कि एमवीसी विधियों के लिए लेनदेन (डिफ़ॉल्ट रूप से) संलग्न करना संभव नहीं है। लगता है कि उस लिंक में सुझाया गया समाधान स्प्रिंग 2.5 (ओवरराइडिंग हैंडलरक्वेट) के लिए प्रतीत होता है। किसी भी मदद की वास्तव में सराहना की जाएगी। धन्यवाद

@Controller 
public class AuthenticationController { 
@Autowired 
CategoryService categoryService;  
@Autowired 
BrandService brandService; 
@Autowired 
ItemService itemService; 

@RequestMapping(value="/login.html",method=RequestMethod.GET) 
ModelAndView login(){  
    return new ModelAndView("login.jsp");  
} 
@RequestMapping(value="/home.html",method=RequestMethod.GET) 
@Transactional 
ModelAndView home(HttpServletRequest request, HttpServletResponse response){ 
    List<Category> categories = categoryService.readAll(); 
    request.setAttribute("categories", categories);  
    List<Brand> brands = brandService.readAll(); 
    request.setAttribute("brands", brands);  
    List<Item> items = itemService.readAll(); 
    request.setAttribute("items", items); 
    Set<Image> images = items.get(0).getImages(); 
    for(Image i : images) { 
     System.out.println(i.getUrl()); 
    } 
    return new ModelAndView("home.jsp");  
} 
+0

के बारे में एक अच्छा लेख आप यहाँ रोलबैक की कोशिश कर रहे है? नियंत्रक फ़ंक्शन पर जहां आपने @ ट्रांज़ेक्शन एनोटेशन को परिभाषित किया है, वहां ऐसा कोई डेटाबेस ऑपरेशन नहीं है जिसे वापस लुढ़काया जा सकता है। मैं उलझन में हूं। –

+0

श्रेणी सेवा जैसी सभी सेवा कॉल .readAll() डेटाबेस ऑपरेशंस – Subin

+0

हां हैं लेकिन आप पढ़े गए डेटा को वापस नहीं ले सकते हैं। आप वास्तव में वापस रोल करने की कोशिश कर रहे हैं? –

उत्तर

4

तुम एक इंटरफ़ेस को लागू करने, ताकि वसंत कुछ यह एक प्रॉक्सी इंटरफेस के रूप में उपयोग कर सकते हैं की आवश्यकता होगी:

@Controller 
public interface AuthenticationController { 
    ModelAndView home(HttpServletRequest request, HttpServletResponse response); 
} 

@Controller 
public class AuthenticationControllerImpl implements AuthenticationController { 

@RequestMapping(value="/home.html",method=RequestMethod.GET) 
@Transactional 
@Override 
ModelAndView home(HttpServletRequest request, HttpServletResponse response){ 
..... 
} 
} 
+0

धन्यवाद – Subin

+0

वसंतबूट 1.2.3.RELEASE का उपयोग वसंत 4.1.6.RELEASE के साथ किया गया है। मैं वास्तव में विपरीत का सामना करता हूं: यदि नियंत्रक (@RequestMapping) औपचारिक रूप से एक इंटरफ़ेस लागू करता है, तो वसंत एक जेडीकेडैनेमिकऑप्रप्रॉक्सी बनाता है (जो त्रुटियों के बिना शुरू होता है लेकिन प्रेषक सर्वलेट को रनटाइम पर यूआरएल मैपिंग के लिए एंट्री पॉइंट नहीं मिलते हैं)। यदि नियंत्रक औपचारिक रूप से एक इंटरफ़ेस को कार्यान्वित नहीं करता है, तो CglibAopProxy उत्पन्न होता है, और सब कुछ पूरी तरह से काम करता है। नीचे chrismarx की टिप्पणी के विपरीत, CGLib को एक स्पष्ट निर्भरता की आवश्यकता नहीं है। – Heri

4

स्प्रिंग JDK गतिशील प्रॉक्सी का उपयोग कर लेन-देन संबंधी तर्क को लागू करेगा, इन पर भरोसा करते हैं उपयुक्त इंटरफेस लागू करने वाले प्रॉक्सित कक्षाएं। सीजीएलआईबी प्रॉक्सी का उपयोग करना भी संभव है जिसमें इंटरफेस की आवश्यकता नहीं है।

इस link

+0

मुझे लगता है कि यह बेहतर जवाब है, स्प्रिंग नियंत्रक के लिए cglib प्रॉक्सी बनाने का प्रयास करेगा यदि आप इंटरफ़ेस निर्दिष्ट नहीं करते हैं, और जब तक क्लासपाथ पर cglib है, यह सब बस काम करता है, और आपको बदलने से निपटने की आवश्यकता नहीं है कुछ भी। मैं काम करने के लिए इंटरफ़ेस के साथ नियंत्रक प्राप्त करने की कोशिश कर @requestmapping के साथ समस्याओं में भाग गया – chrismarx