2012-06-05 17 views
10

कुछ रनटाइम जेनरेट एपीआई दस्तावेज प्रदान करने के लिए मैं सभी स्प्रिंग एमवीसी नियंत्रकों पर फिर से शुरू करना चाहता हूं। सभी नियंत्रकों को वसंत @ नियंत्रक एनोटेशन के साथ एनोटेट किया गया है। वर्तमान में मैं इसे इस तरह कार्य करें:स्प्रिंग एमवीसी में सभी नियंत्रकों को कैसे खोजें?

for (final Object bean: this.context.getBeansWithAnnotation(
     Controller.class).values()) 
{ 
    ...Generate controller documentation for the bean... 
} 

लेकिन इस कोड के पहले कॉल बेहद धीमी है। मुझे आश्चर्य है कि वसंत से अधिक क्लासपाथ में केवल परिभाषित सेम की जांच के बजाय कक्षाओं को फिर से चलाता है। उपरोक्त कोड चलाए जाने पर नियंत्रक पहले ही लोड हो चुके हैं, लॉग इन सभी को उनके अनुरोध मैपिंग के साथ प्रदर्शित करता है, इसलिए स्प्रिंग एमवीसी को पहले से ही उन्हें सब कुछ पता होना चाहिए और उनमें से एक सूची प्राप्त करने का एक तेज़ तरीका होना चाहिए। पर कैसे?

+0

मुझे आश्चर्य है कि आपको उस जानकारी की आवश्यकता क्यों होगी, क्योंकि आप '@ नियंत्रक' की टिप्पणियां कर रहे हैं वैसे भी – ant

+3

उन्होंने उल्लेख किया है कि सवाल में यह स्पष्ट रूप से है कि वह उन नियंत्रकों के लिए प्रलेखन जेनरेट करना चाहता है। –

उत्तर

16

मुझे कुछ महीनों से पहले इस तरह की आवश्यकता भी मिली है और मैंने इसे निम्नलिखित कोड स्निपेट का उपयोग करके हासिल कर लिया है।

ClassPathScanningCandidateComponentProvider scanner = new ClassPathScanningCandidateComponentProvider(false); 
     scanner.addIncludeFilter(new AnnotationTypeFilter(Controller.class)); 
     for (BeanDefinition beanDefinition : scanner.findCandidateComponents("com.xxx.yyy.controllers")){ 
      System.out.println(beanDefinition.getBeanClassName()); 
     } 

आप अपने नियंत्रकों के साथ ऐसा कुछ भी कर सकते हैं।

कोड स्निपेट अपडेट किया गया। आवश्यक समझ को हटाने के लिए आवश्यक कोड को हटाया गया और केवल नियंत्रकों के वर्ग का नाम प्रदर्शित किया गया। उम्मीद है कि यह आपकी मदद करता है। चीयर्स।

+0

अच्छा स्निपेट (+1)। लेकिन मुझे लगता है कि यह बहुत कम स्तर है। मेरा मतलब यह एक स्कैन * वर्ग * है। मेरा मानना ​​है कि 'getBeansWithAnotation() 'कार्यान्वयन के अंदर स्कैनर का उपयोग करना चाहिए। – AlexR

+0

आप सही हो सकते हैं। लेकिन वह इसे हासिल करने का एक तेज़ तरीका चाहता है। उत्तर मैंने उपरोक्त कोड स्निपेट का उपयोग किया है और यह मेरे लिए धीमा नहीं है। Thats क्यों मैंने यह सुझाव दिया। और यह स्कैनर वर्ग वसंत द्वारा ही प्रदान किया जाता है, इसलिए मेरे अनुसार यह निम्न स्तर नहीं है। –

+1

GetBeansWithAnnotation() से बहुत बढ़िया और बहुत तेज़ काम करता है। धन्यवाद! – kayahr

27

मुझे @ जैप्स द्वारा सुझाए गए दृष्टिकोण पसंद हैं, लेकिन वैकल्पिक दृष्टिकोण की भी सिफारिश करना चाहेंगे। यह आपके अवलोकन पर आधारित है कि क्लासपाथ को पहले ही स्प्रिंग द्वारा स्कैन किया गया है, और नियंत्रक और अनुरोध मैप किए गए तरीकों को कॉन्फ़िगर किया गया है, यह मानचित्रण handlerMapping घटक में बनाए रखा गया है। यदि आप स्प्रिंग 3.1 का उपयोग कर रहे हैं तो यह handlerMapping घटक RequestMappingHandlerMapping का एक उदाहरण है, जिसे आप हैंडलर मैप किए गए मोड और संबंधित नियंत्रकों को खोजने के लिए क्वेरी कर सकते हैं, यदि आप स्प्रिंग के पुराने संस्करण पर हैं, तो आप एक समान उपयोग करने में सक्षम होना चाहिए दृष्टिकोण):

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; 

@Controller 
public class EndpointDocController { 
 private final RequestMappingHandlerMapping handlerMapping; 
  
 @Autowired 
 public EndpointDocController(RequestMappingHandlerMapping handlerMapping) { 
  this.handlerMapping = handlerMapping; 
 } 
   
 @RequestMapping(value="/endpointdoc", method=RequestMethod.GET) 
 public void show(Model model) { 
  model.addAttribute("handlerMethods", this.handlerMapping.getHandlerMethods()); 
 } 
} 

मैं इस यूआरएल http://biju-allandsundry.blogspot.com/2012/03/endpoint-documentation-controller-for.html

इस पर इस बारे में अधिक जानकारी उपलब्ध कराई है स्प्रिंग स्रोत के रोसन Stoyanchev द्वारा स्प्रिंग 3.1 पर एक प्रस्तुति पर आधारित है।

+1

यह बहुत बढ़िया है। मैं इसके साथ जाऊंगा –

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