春天路径参与多个斜线

问题描述 投票:0回答:4

我有一个Spring启动应用程序,我有一个API,其他URL作为路径参数。例如:

host:port/{eid}是我的基本路径,在此之后我可以拥有像这样的URL

host:port/{eid}/abc
host:port/{eid}/abc/pqr/
host:port/{eid}/abc/pqr/b=2
host:port/{eid}/abc/pqr/xyz
host:port/{eid}/abc/pqr/xyz?a=1

...等等...

我想定义一个控制器,我可以映射到所有上面的URL,这应该是类似的工作

@RequestMapping(value = "/{eid}/{urlParts}", method = RequestMethod.GET)
public ResponseEntity<Object> share(
        @PathVariable String eid, 
        @PathVariable String urlParts) {
 ...... 
}

我尝试使用@PathVariable Map<String, String> path@RequestMapping(value = "/{eid}/{urlParts:.+}"

但无法获得预期的结果。

是否有任何解决方案在路径参数中接收路径斜杠(/)。

注意:我无法对URL中的斜杠(/)进行URL编码。那对我来说不是一个选择。

java spring spring-boot spring-web
4个回答
0
投票

如果你使用jsp或其他东西,为什么不尝试使用@RequestParam来获取url ..

@PathVariable意味着应该从调用的URL的路径中提取带注释的方法参数。 @RequestParam意味着必须从请求参数中提取带注释的方法参数。这些注释都不会导致带注释的参数被放入请求,会话或应用程序范围中。

所以你也用你的地图......

$ {username}表示“在响应中写入用户名属性的值(在页面中找到,或者在请求,会话或应用程序范围中找到)”。由于您没有在任何这些范围中包含任何用户名属性,因此它不会写任何内容。

如果方法返回ModelAndView对象,并且模型包含username属性和studentid属性,则代码将起作用。


0
投票

你可以参考下面的代码和链接:

第一个URL:localhost:8080 / projectName / test?firstname = john

第二个URL:localhost:8080 / projectName / test?firstname = john&secondname = roy

    @Controller
    @RequestMapping("/test")
    public class TestController {




    @RequestMapping(value = { "/test/{firstname}/test" }, method = { RequestMethod.GET })
public String someMethod(@PathVariable("firstname") String firstname){
    return someMethod(firstValue )

}

    @RequestMapping(value = { "/test/{firstname}/{otherString}/test" }, method = { RequestMethod.GET })
public String someOtherMethod(@PathVariable("firstname") String firstname, @PathVariable("secondname") String secondValue) {
    return someMethod(firstValue + "/" + secondValue)

 }
}

0
投票

所以我不确定是否有直接的弹簧实现,但是,你可以把我们混合在一起。

  • @RequestParam - 返回URL参数的映射(继?之后)
  • @PathVariable - 返回eid
  • HttpServletRequest - 使用请求返回URI并剥离host:port / {eid}以及之后的任何内容? ,然后使用Arrays.asList(str.split(“/”)); (记住这是使用new ArrayList<Sting>(Arrays.asList(str.split("/")))的数组的包装器) @RequestMapping(value = "/{eid}", method = RequestMethod.GET) public ResponseEntity<Object> share( @PathVariable String eid, @RequestParam Map<String,String> allRequestParams, HttpServletRequest request) { ...... }

0
投票

我知道查询太旧但仍然有用,这个答案可以帮助其他人。您可以使用请求属性获取完整的网址部分,如下所示。

@RequestMapping(value = "/{eid}/**", method = RequestMethod.GET)
public ResponseEntity<Object> share(@PathVariable String eid, HttpServletRequest request) {

    Object uriObject = request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
    if (null != uriObject) {
        String urlParts = uriObject.toString().replaceFirst("^/" eid + "/", "");
    }
    ....
}
© www.soinside.com 2019 - 2024. All rights reserved.