regex 是否将请求路径与@PathVariable字符串匹配?

gzszwxb4  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(107)

在我的控制器类上,我有一个典型的@RequestMapping注解,其中包含@PathVariable注解的占位符:

@RequestMapping("/customer/{id}/{whatever}")
public class CustomerController {
    @GetMapping
    public Customer getCustomer(@PathVariable final int id, @PathVariable final String whatever) {...}
}

现在,我需要将@RequestMapping模式字符串(如/customer/{id}/{whatever})与真实的路径(如/customer/1234/xyz)进行匹配。因此,我需要知道id1234whateverxyz

是否有任何实用方法可以做到这一点?(我需要一个通用的解决方案,而不是上面路径的正则表达式。

rbl8hiat

rbl8hiat1#

我尝试用正则表达式来解决它,但我认为它不太稳定,在特殊情况下会失败:

protected static Map<String, String> matchPath(String pathPattern, String path) {
    final Matcher matcher = Pattern.compile("\\{([^\\/\\}]+)\\}").matcher(pathPattern);
    List<String> keys = matcher.results().map(x -> x.group(1)).toList();
    final String newRegex = matcher.replaceAll("([^\\/\\}]+)");

    final Matcher newMatcher = Pattern.compile(newRegex).matcher(path);
    newMatcher.find();
    final List<String> values = IntStream.rangeClosed(1, newMatcher.groupCount()).mapToObj(i -> newMatcher.group(i)).toList();

    return IntStream.range(0, keys.size()).boxed().collect(Collectors.toMap(keys::get, values::get));
}

试验:

@Test
void matchPath() {
    final Map<String, String> results = matchPath("/customer/{id}/{whatever}", "/customer/1234/xyz");
    
    assertThat(results.size(), is(2));
    assertThat(results.get("id"), is("1234"));
    assertThat(results.get("whatever"), is("xyz"));
}

首先,我找到所有的"键"并用"([^\\/\\}]+)"表达式替换{...}占位符,这给了我一个新的正则表达式,我用它来匹配查找值。
但是我对这个手工制作的解决方案不是很满意...

jyztefdp

jyztefdp2#

你能解释一下你到底想做什么吗...?
因为根据我的理解,你不想使用@pathvariable注解。
同样,您可以对@Requestparam注解执行相同的操作。
如下所示:/客户?id= 1234 &无论什么=xyz
在控制器中,您可以使用@RequestParam(name =“id”int id)和@RequestParam(name =“whatever”String whatever)

相关问题