春天路径参与多个斜线

时间:2017-07-21 06:51:55

标签: java spring spring-boot spring-web

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

host:port/{eid}是我的基本路径,之后我可以使用

这样的网址
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对网址中的斜杠(/)进行编码。这对我来说不是一个选择。

4 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

您可以参考以下代码和链接:

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

第二个网址:localhost:8080 / projectName / test?firstname = john&amp; 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)

 }
}

答案 2 :(得分:0)

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

  • @RequestParam - 返回网址参数的地图(继?之后)
  • @PathVariable - 返回eid
  • HttpServletRequest - 使用请求返回URI并剥离host:port / {eid}以及之后的任何内容? ,然后使用Arrays.asList(str.split(&#34; /&#34;)); (记住这是使用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) {
      ...... 
    }
    

答案 3 :(得分:0)

我知道查询过旧,但仍然有用,此答案可以帮助其他人。 您可以使用request属性获取完整的url部分,如下所示。

   <androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.4" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_percent="0.1" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerViewItems"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        app:layout_constraintBottom_toTopOf="@+id/guideline3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/guideline2" />

</androidx.constraintlayout.widget.ConstraintLayout>