Có lẽ, đó là một bản hack xấu xí, tôi chỉ muốn khám phá khả năng mở rộng của Spring @MVC. Đây là một tùy chỉnh PathMatcher
. Nó sử dụng $
trong mẫu làm điểm đánh dấu kết thúc - nếu mẫu kết thúc bằng điểm đánh dấu, điểm đánh dấu bị xóa và mẫu được khớp với đối sánh mặc định, nhưng nếu mẫu có $
ở giữa (ví dụ: ...$.*
), mẫu đó không khớp.
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;
}
}
}
Config:
<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>
Và sử dụng (cho "/hello/1.2.3", value
là "1.2.3"):
@RequestMapping(value = "/hello/{value}$", method = RequestMethod.GET)
public String hello(@PathVariable("value") String value, ModelMap model)
EDIT:: Bây giờ không phá vỡ "dấu gạch chéo theo sau không quan trọng" quy tắc
Điều đó đã làm điều đó, nhờ Skaffman. Nhưng nó đã phá vỡ một phần khác của ứng dụng ... contentNegotiatingViewResolver mà ánh xạ phần mở rộng ".json" của Jackson không còn hoạt động nữa. có ý tưởng nào để sửa cái này không? – nickdos
Sắp xếp sự cố với nội dungNegotiatingViewResolver bằng cách liên kết rõ ràng phương pháp điều khiển của tôi với URL bao gồm ".json". Ví dụ. bằng cách sử dụng chú thích: @RequestMapping (value = "/search.json", method = RequestMethod.GET). Có một giải pháp đẹp hơn cho điều này? – nickdos
Bạn đã thử '@RequestMapping (giá trị ="/tìm kiếm * ")'? – skaffman