शायद, यह एक बदसूरत हैक है, मैं सिर्फ वसंत @ एमवीसी की विस्तारशीलता का पता लगाने के लिए चाहता था। यहां एक अनुकूलित PathMatcher
है। यह पैटर्न में $
का उपयोग करता है, अंत में मार्कर के रूप में - यदि पैटर्न इसके साथ समाप्त होता है, तो मार्कर हटा दिया जाता है और पैटर्न को डिफ़ॉल्ट मैचर द्वारा मेल किया जाता है, लेकिन यदि पैटर्न में $
मध्य में है (उदा। ...$.*
), तो इस तरह का पैटर्न मेल नहीं खाता है।
public class CustomPathMatcher implements PathMatcher {
private PathMatcher target;
public CustomPathMatcher() {
target = new AntPathMatcher();
}
public String combine(String pattern1, String pattern2) {
return target.combine(pattern1, pattern2);
}
public String extractPathWithinPattern(String pattern, String path) {
if (isEncoded(pattern)) {
pattern = resolvePattern(pattern);
if (pattern == null) return "";
}
return target.extractPathWithinPattern(pattern, path);
}
public Map<String, String> extractUriTemplateVariables(String pattern,
String path) {
if (isEncoded(pattern)) {
pattern = resolvePattern(pattern);
if (pattern == null) return Collections.emptyMap();
}
return target.extractUriTemplateVariables(pattern, path);
}
public Comparator<String> getPatternComparator(String pattern) {
final Comparator<String> targetComparator = target.getPatternComparator(pattern);
return new Comparator<String>() {
public int compare(String o1, String o2) {
if (isEncoded(o1)) {
if (isEncoded(o2)) {
return 0;
} else {
return -1;
}
} else if (isEncoded(o2)) {
return 1;
}
return targetComparator.compare(o1, o2);
}
};
}
public boolean isPattern(String pattern) {
if (isEncoded(pattern)) {
pattern = resolvePattern(pattern);
if (pattern == null) return true;
}
return target.isPattern(pattern);
}
public boolean match(String pattern, String path) {
if (isEncoded(pattern)) {
pattern = resolvePattern(pattern);
if (pattern == null) return false;
}
return target.match(pattern, path);
}
public boolean matchStart(String pattern, String path) {
if (isEncoded(pattern)) {
pattern = resolvePattern(pattern);
if (pattern == null) return false;
}
return target.match(pattern, path);
}
private boolean isEncoded(String pattern) {
return pattern != null && pattern.contains("$");
}
private String resolvePattern(String pattern) {
int i = pattern.indexOf('$');
if (i < 0) return pattern;
else if (i == pattern.length() - 1) {
return pattern.substring(0, i);
} else {
String tail = pattern.substring(i + 1);
if (tail.startsWith(".")) return null;
else return pattern.substring(0, i) + tail;
}
}
}
कॉन्फ़िग:
<bean id = "pathMatcher" class = "sample.CustomPathMatcher" />
<bean class = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name = "pathMatcher" ref="pathMatcher" />
</bean>
<bean class = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
<property name = "pathMatcher" ref="pathMatcher" />
</bean>
और उपयोग (दिए गए "/hello/1.2.3", value
"1.2.3" है):
@RequestMapping(value = "/hello/{value}$", method = RequestMethod.GET)
public String hello(@PathVariable("value") String value, ModelMap model)
संपादित करें:: अब "पिछला स्लैश कोई फर्क नहीं पड़ता" नियम
यह चाल है, धन्यवाद स्काफमैन। लेकिन यह ऐप का एक और हिस्सा तोड़ दिया ... सामग्री नेगोशिएटिंग व्यूसेसोल्वर जो जैक्सन के लिए ".json" एक्सटेंशन को मैप करता है अब काम नहीं करता है। कोई राय कि इसे कैसे ठीक किया जाए? – nickdos
".json" सहित URL के साथ स्पष्ट रूप से मेरे नियंत्रक विधि को जोड़कर सामग्री के साथ समस्या को हल किया गया है। जैसे एनोटेशन का उपयोग करके: @RequestMapping (value = "/search.json", method = RequestMethod.GET)। क्या इसका कोई अच्छा समाधान है? – nickdos
क्या आपने '@RequestMapping (value ="/search * ") की कोशिश की है? – skaffman