2012-12-24 12 views
12

मिलान कैसे संजीदगी से सभी नियंत्रकों की सूची प्राप्त करने नियंत्रकों की सूची प्राप्त करने (सबसे अच्छा न केवल करता है, तो उसकी व्याख्या, लेकिन यह भी XML में निर्दिष्ट), अपने वसंत MVC आवेदन में कुछ specfic यूआरएल मिलान?संजीदगी से वसंत MVC विशिष्ट यूआरएल

का केवल-टिप्पणी किए गए मामले में,

@Autowired 
private ListableBeanFactory listableBeanFactory; 
... 
whatever() { 
    Map<String,Object> beans = listableBeanFactory.getBeansWithAnnotation(RequestMapping.class); 

    // iterate beans and compare RequestMapping.value() annotation parameters 
    // to produce list of matching controllers 
} 

इस्तेमाल किया जा सकता है, लेकिन अधिक सामान्य मामले में, जब नियंत्रक spring.xml config में निर्दिष्ट किया जा सकता में क्या करना है? और अनुरोध-पथ पैरामीटर के साथ क्या करना है?

+0

कैसे आप इस जानकारी का उपयोग करने के लिए योजना बनाई है? स्प्रिंग टूल सूट आपको यह जानकारी आईडीई के अंदर देगी। https://github.com/kdgregory/pathfinder – kdgregory

+0

मैं अपने वेब आवेदन के लिए गतिशील-मेनू प्रणाली को लागू करने की कोशिश कर रहा हूँ (मैं कुछ अद्यतन बाद में इस सप्ताह विलय हो जाएगा): नहीं तो, यहाँ एक उपयोगिता है कि मैंने लिखा है।मुझे स्रोत कोडों का सांख्यिकीय रूप से विश्लेषण करने की आवश्यकता नहीं है (मेरा विचार पहले से ही ऐसा करता है), मुझे इसे रन-टाइम का विश्लेषण करने की आवश्यकता है। –

+0

आप XML कॉन्फ़िगरेशन में प्रासंगिक नियंत्रकों को खोजने की योजना कैसे बनाते हैं? हो सकता है कि आप रनटाइम पर 'org.springframework.web.bind.annotation.support.HandlerMethodResolver.getHandlerMethods()' तक पहुंच सकें और लौटाए गए तरीकों को संसाधित कर सकें। –

उत्तर

23

वसंत 3.1 के बाद से, श्रेणी RequestMappingHandlerMapping है, यह @ नियंत्रक कक्षाओं के मैपिंग (RequestMappingInfo) के बारे में जानकारी प्रदान करता है।

@Autowired 
private RequestMappingHandlerMapping requestMappingHandlerMapping; 

@PostConstruct 
public void init() { 
    Map<RequestMappingInfo, HandlerMethod> handlerMethods = 
           this.requestMappingHandlerMapping.getHandlerMethods(); 

    for(Entry<RequestMappingInfo, HandlerMethod> item : handlerMethods.entrySet()) { 
     RequestMappingInfo mapping = item.getKey(); 
     HandlerMethod method = item.getValue(); 

     for (String urlPattern : mapping.getPatternsCondition().getPatterns()) { 
      System.out.println(
       method.getBeanType().getName() + "#" + method.getMethod().getName() + 
       " <-- " + urlPattern); 

      if (urlPattern.equals("some specific url")) { 
       //add to list of matching METHODS 
      } 
     } 
    }  
} 

यह महत्वपूर्ण है कि इस सेम वसंत संदर्भ में, जहां नियंत्रकों परिभाषित कर रहे हैं में परिभाषित किया गया है।

+0

मुझे RequestMappingHandlerMapping प्रकार का कोई बीन नहीं सामना कर रहा है। ऑटोवॉयरिंग से पहले इस बीन को कौन सी करेगा? क्या आप मेरी मदद कर सकते हैं? –

3

आप ListableBeanFactory इंटरफ़ेस का उपयोग कर सभी सेम नाम प्राप्त करने का प्रयास कर सकते हैं।

private @Autowired ListableBeanFactory beanFactory; 

public void doStuff() { 
    for (String beanName : beanFactory.getBeanDefinitionNames()) { 
     if (beanName.startsWith("env")) { // or whatever check you want to do 
      Object bean = beanFactory.getBean(beanName) 
      // .. do something with it 
     } 
    } 
} 

ListableBeanFactory here के दस्तावेज़ देखें। इस इंटरफेस) getBeansOfType(), getBeanDefinitionCount (जैसे कई तरीकों आदि प्रदान करता है

इस दृष्टिकोण की सूची नहीं है, तो @Controller एनोटेट सेम visit this पेज देखने के लिए कि कैसे किया जा सकता।

5

आप HandlerMapping.getHandler(HTTPServletRequest).getHandler() को फोन करके एक मैप की गई नियंत्रक मिलता है। IoC द्वारा एक हैंडलर मैपिंग उदाहरण प्राप्त किया जा सकता है। यदि आपके पास HTTPServletRequest नहीं है तो आप एक MockHttpServletRequest के साथ अपना अनुरोध बना सकते हैं।

@Autowired 
private HandlerMapping mapping; 

public Object getController(String uri) { 
    MockHttpServletRequest request = new MockHttpServletRequest("GET", uri); 
    // configure your request to some mapping 
    HandlerExecutionChain chain = mapping.getHandler(request); 
    return chain.getHandler(); 
} 

क्षमा करें, मैं अब पढ़ है कि आप एक URL के लिए सभी नियंत्रकों चाहते हैं। यह आपको केवल एक बिल्कुल मेल खाने वाला नियंत्रक देगा। यह स्पष्ट रूप से नहीं चाहता कि आपको चाहिए।

1

आप प्रेषक को सर्वलेट

<bean name="requestHandlerMapping" class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"> 
     <property name="useTrailingSlashMatch" value="true"></property> 
    </bean> 

डिस्पैचर सर्वलेट इस मानचित्रण पर गौर करेंगे में RequestMappingHandlerMapping के लिए एक प्रवेश करते हैं और अपने नियंत्रक में से किसी में

अब अपने आवेदन में एक सेम RequestMappingHandlerMapping का दृष्टांत की जरूरत है/कक्षा आप

@Autowired 
private HandlerMapping mapping; 

का उपयोग कर सकते हैं और इसे ठीक काम करना चाहिए।

नोट: आपको बीन जोड़ने की देखभाल करने की आवश्यकता है, यदि आपके किसी भी प्रेषक (बड़े आवेदन के मामले में) में यह बीन होता है तो इसका परिणाम नॉनिकिकियन अपवाद और एप्लिकेशन शुरू नहीं होगा।

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