2013-01-21 15 views
6

2 वसंत नियंत्रक मैपिंग है:मैं स्प्रिंग एमवीसी मानचित्रण पर प्राथमिकता कैसे निर्धारित करूं?

@Controller 
public class ContentController { 

    @RequestMapping(value = "**/{content}.html") 
    public String content(@PathVariable String content, Model model, HttpServletRequest request) { 
    } 
} 

@Controller 
public class HomeController { 

    @RequestMapping(value = "**/home") 
    public String home(HttpServletRequest request, Model model) { 
    } 
} 

निम्नलिखित यूआरएल दोनों मैपिंग मेल खाता है: /home.html

हालांकि, मैं यह सुनिश्चित करें कि 'सामग्री' मानचित्रण हमेशा अधिक प्राथमिकता दी जाती है चाहता हूँ ' घर 'मानचित्रण। क्या कोई तरीका है जिसे मैं निर्दिष्ट कर सकता हूं?

+1

क्या वे दो विधियां समान .java फ़ाइल में हैं? – sp00m

+0

अलग फाइलें। इसे प्रतिबिंबित करने के लिए अद्यतन प्रश्न। – JasonStoltz

+0

क्या कोई कारण है कि आप अपने मैपिंग के लिए ऐसे लालची पथ का उपयोग कर रहे हैं? – dardo

उत्तर

0

यूआरएल मानचित्रण मैपिंग की खोज के क्रम द्वारा निर्धारित किया जाता है।

तो आप अन्य नियंत्रक के बाद वसंत संदर्भ में एक नियंत्रक को बनाने के लिए मजबूर कर सकते हैं।

यह बीन परिभाषा (xml में) पर निर्भर-ऑन = "" विशेषता का उपयोग करके किया जा सकता है।

मुझे यकीन नहीं है कि यह पहले मैपिंग का उपयोग करता है या आखिरी है।

इसके अलावा, यह केवल सिद्धांत है, मैंने वास्तव में यह कोशिश नहीं की है।

मैं इस तरह के संदेश लॉग ऑन देखें:

17:29:01.618 [main] INF S o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0' 
17:29:01.625 [main] INF S o.s.w.s.h.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0' 

तो देखने के लिए यह कैसे काम करता SimpleUrlHandlerMapping पर एक लोक होने के लायक।

+0

यह एक शॉट दे रहा है ... – JasonStoltz

+0

मैंने कोशिश की और यह काम नहीं कर रहा था। मैं अनुमान लगा रहा हूं कि मैपिंग की विशिष्टता के साथ क्या करना है ... अर्थात्,/home को {content} .html से अधिक विशिष्ट माना जाता है, इसलिए इसका मूल्यांकन पहले किया जाता है। वैसे भी एक हंच संपादित करें: http://stackoverflow.com/questions/2326912/ordered-requestmapping-in-spring-mvc – JasonStoltz

+2

भले ही यह काम करता है, मुझे नहीं लगता कि यह वांछित प्रभाव होगा। मेरा मानना ​​है कि स्प्रिंग हमेशा अधिक विशिष्ट मैपिंग पसंद करेगी। – JasonStoltz

-2

इस यूआरएल (/home.html) दोनों मैपिंग से मेल खाता नहीं करता है:

@RequestMapping(value = "**/{content}.html") 
    ... 
    @RequestMapping(value = "**/home") 
    … 

क्योंकि यह एक प्रत्यय ".html" है यह सिर्फ पहले एक से मेल खाते हैं!

+1

यह दोनों से मेल खाता है। RequestMapping में प्रत्यय की आवश्यकता नहीं है। – JasonStoltz

4

मैं हाल ही में बहुत समान समस्या थी, जहां मैं अस्पष्ट यूआरएल के दो प्रकार के लिए था:

  • एक एक वर्ष को स्वीकार किया गया था, का कहना है कि /2012, /2013 आदि मैं इसे इस तरह नियमित अभिव्यक्ति के साथ मानचित्रण का उपयोग कर बनाया: @RequestMapping("/{year:(?:19|20)\\d{2}}")
  • कोई अन्य सामग्री पहचानकर्ता (उर्फ स्लग) स्वीकार कर रहा था। मैंने इसे @RequestMapping("/{slug}") जैसे मैपिंग का उपयोग करके बनाया है।

यह महत्वपूर्ण था कि "वर्ष" नियंत्रक विधि "स्लग" पर प्राथमिकता ले रही थी। दुर्भाग्य से (मेरे लिए) वसंत हमेशा "स्लग" नियंत्रक विधि का उपयोग कर रहा था।

के रूप में वसंत MVC अधिक विशिष्ट मैपिंग पसंद है, मैं अपने "स्लग" पैटर्न कम विशिष्ट करना था। Path Pattern Comparison प्रलेखन के आधार पर, मैं स्लग मानचित्रण के लिए वाइल्ड कार्ड कहा: @RequestMapping("/{slug}**")

मेरे नियंत्रकों कि तरह लग रहे और जब एक साल (/2012, /1998 आदि) URL में अब listByYear कहा जाता है।

@Controller 
public class ContentController 
{ 
    @RequestMapping(value = "/{slug}**") 
    public String content(@PathVariable("slug") final String slug) 
    { 
     return "content"; 
    } 
} 

और

@Controller 
public class IndexController 
{ 
    @RequestMapping("/{year:(?:19|20)\\d{2}}") 
    public String listByYear() 
    { 
     return "list"; 
    } 
} 

यह वास्तव में कैसे एक प्राथमिकता (जो मेरी राय में एक अद्भुत सुविधा होगी) स्थापित करने के लिए, लेकिन "अच्छा" वैकल्पिक हल के कुछ प्रकार देने के लिए और में काम हो सकता है नहीं है भविष्य।

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